none
Application avec db SqLite RRS feed

  • Question

  • Bonjour,

     je fais une petite application qui utilise SqLite comme DB.

    J'utilise SqLite afin de pouvoir installer cette appli sur des machines qui ne disposent pas de Sql server.

    Donc.. dans mon appli, je créé mon fichier db comme ceci :

    File.CreateText(file);
     

    Ensuite, j'ai 2 méthodes qui créent 1° ma table User et la 2° qui rempli cette table.

    public static void CreateTable()
            {
                string sql = @"CREATE TABLE User(
    	                        Id [int] IDENTITY(1,1)  PRIMARY KEY,
    	                        UserName varchar(150) NOT NULL,
    	                        Login varchar(50) NOT NULL,
    	                        Password varchar (50) NOT NULL,
    	                        IsActive bit NOT NULL
                                )
                                ";
                
                SQLiteDatabase.ExecuteNonQuery(sql);
            }
    
            public static void CreateAdmin()
            {
                string sql = @"INSERT INTO User
                               ([UserName]
                               ,[Login]
                               ,[Password]
                               ,[IsActive])
                                VALUES
                               ('Admin'
                               ,'admin'
                               ,'admin'
                               ,1)
                                ";
                SQLiteDatabase.ExecuteNonQuery(sql);
            }

    Mon fichier db se créé sans problème.

    Par contre lorsque je créé la tableUser, j'ai le message d'erreur suivant lors du premier lancement de mon appli: "attempt to write a readonly database".

    Si je relance mon appli, la table User est créée, les données sont insérées mais parcontre le champ Id de la table User n'est pas incrémenté. Pourtant il me semble qu'en définissant Id en Identity(1,1) PRIMARY KEY cela devrait marcher.

    Auriez-vous une explication?

    Merci pour votre aide !

    lundi 8 décembre 2014 20:09

Réponses

  • Bonjour,

    la solution était en effet de laisser le fournisseur SqLite créer lui même le fichier de base de données. Je ne savais pas qu'il s'en chargerait.

    L'incrémentation fonctionne également.

    Quel outil SqLite utilisez-vous?

    Merci à tous pour vos réponses !

    mardi 9 décembre 2014 19:07

Toutes les réponses

  • hi, Make sure that the anonymous web user account (NETWORK SERVICE or maybe something else) under which your web application executes has read/write/create/delete access to the folder where the sqlite database resides.
    mardi 9 décembre 2014 10:30
  • Bonjour,

    Il faut faire attention à une chose lorsque l'on utilise des méthodes telles que File.Create, File.CreateText, etc : ce genre de méthode renvoie soit un FileStream soit un StreamWriter. Il s'agit d'un flux qui est tout de suite ouvert lors de l'utilisation de ce genre de méthode. A mon avis c'est ici la raison pour laquelle l'écriture à partir du fournisseur d'accès à SQLite a échoué : le Stream est ouvert avec un verrou. Donc quand on a utilisé "File.Create" ou "File.CreateText", il faut bien penser à fermer d'abord le flux ou alors à utiliser directement ce flux pour travailler.

    Le fournisseur d'accès SQLite ouvre lui-même le flux, et c'est pour ça qu'il s'est heurté au premier flux ouvert.

    D'ailleurs à propos, ce n'était pas vraiment utile de faire un "File.CreateText" car le comportement du fournisseur SQLite est de créer automatiquement le fichier s'il n'existe pas, il faut vraiment mettre une option particulière dans sa chaine de connexion pour qu'il échoue si le fichier de base de données n'existe pas.

    En ce qui concerne le identity, j'ai testé avec un outil SQLite, il m'a plutôt mis :

    CREATE TABLE [TBL_TEST] (
      [ID] INTEGER NOT NULL ON CONFLICT FAIL PRIMARY KEY ON CONFLICT FAIL AUTOINCREMENT);

    C'est à dire "AUTOINCREMENT" au lieu de "Identity(1,1)".


    Philippe


    • Modifié PhGr_ mardi 9 décembre 2014 10:49 Complément d'info
    • Proposé comme réponse PhGr_ mardi 9 décembre 2014 13:41
    mardi 9 décembre 2014 10:44
  • Bonjour, paintbox00,

    J’espère que le lien en bas vous sera utile:

    http://stackoverflow.com/questions/2333047/attempt-to-write-a-read-only-database-system-data-sqlite

    Attempt to write a read-only database - System.Data.SQLite

    Merci de nous tenir au courant.

    Cordialement,

    Téodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 9 décembre 2014 13:39
    Modérateur
  • Bonjour,

    la solution était en effet de laisser le fournisseur SqLite créer lui même le fichier de base de données. Je ne savais pas qu'il s'en chargerait.

    L'incrémentation fonctionne également.

    Quel outil SqLite utilisez-vous?

    Merci à tous pour vos réponses !

    mardi 9 décembre 2014 19:07
  • J'utilise SQLite expert pour concevoir la base. Il y a une version "personal" gratuite.


    Philippe

    mardi 9 décembre 2014 19:59