2012-10-05 3 views
0

J'utilise l'application C# et l'exécution de l'application dans la machine serveur que Windows service.When i insérer, mettre à jour l'opération de suppression de la machine client, il lance une erreur de verrouillage de la base de données ci-dessous,base de données SQLite est exception verrouillée

database is locked 
    at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt) 
    at System.Data.SQLite.SQLiteDataReader.NextResult() 
    at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave) 
    at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior) 
    at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery() 
    at System.Data.SQLite.SQLiteTransaction.Commit() 

Ci-dessous mon code

public int ExecuteNonQuerySQL(SQLiteCommand cmd) 
    { 
     int ireturn = 0; 
     if (conn.State != ConnectionState.Open) 
       Open(DataFile); 
      using (SQLiteTransaction dbtrans = conn.BeginTransaction(IsolationLevel.ReadCommitted)) 
      { 
        using (cmd.Connection=conn) 
        { 
         cmd.CommandText =cmd.CommandText ; 
          cmd.Transaction = dbtrans; 
          ireturn = cmd.ExecuteNonQuery(); 
          dbtrans.Commit(); 
          cmd.Dispose(); 
         } 
        } 
       } 

S'il vous plaît aidez-moi à cela, je l'ai fait beaucoup de googler et je dois trouver une solution pour résoudre ce problème. Cordialement

+0

Semble que vous ne fermez pas la connexion. – Reniuz

+0

Avant exécution nonquery effectuée, la connexion db est fermée et rouvrir à nouveau .. – user642378

+0

Et après? L'exception de verrouillage peut être due au fait que lorsque vous ouvrez la connexion db, le fichier est verrouillé. Vous devez libérer la connexion verrouillée - fermée. Donc, assurez-vous que vous fermez vraiment la connexion. – Reniuz

Répondre

0

Du code fourni semble que vous ne fermez pas la connexion.

Faites également attention sur le fait, ne sais pas si c'est pertinent dans votre cas ou non, que le Sqlite pas très bon sur le support concurent inserts et parfois DB verrouillé, si vous opérez à partir de plusieurs threads.

+0

J'ai ajouté connosclose methos à la fin de la méthode cmd.Dispose.And monitor.Thank pour l'aide. – user642378

0

Modifier la façon dont vous créez vos objets de connexion et de commande pour être plus comme ceci: https://stackoverflow.com/a/17592858/8479

Assurez-vous que vous n'êtes pas réutilisant un objet SQLite sur un thread différent de celui auquel il a été créé.

Sqlite est normalement très bon en simultané si vous suivez ces deux règles.

Questions connexes