2017-02-09 7 views
0

SQLiteクエリがハングすると、以下のWriteToDB()のExecuteNonQuery()でロックされます。それはUPDATEの間だけロックされているようで、INSERTに問題はありません。これは単一スレッドでのみ実行されます。それがハングすると、作成しようとしているかのようにSQLiteデータベースディレクトリに作成されているジャーナルが表示されます。 ErrorCode = 5、ResultCode = BusyのSQLiteExceptionがスローされます。更新時のC#SQLiteデータベース

public String WriteToDB() 
    { 
     String retString = ""; 

     //see if account exists with this email 
     String sql = ""; 
     bool aExists = AccountExists(); 

     if (!aExists) 
     { 
      sql = "INSERT INTO accounts (email, password, proxy, type, description) VALUES ('" + Email + "', '" + Password + "', '" + Proxy + "', 'dev', '" + Description + "');"; 
      retString = "Added account"; 
     } 
     else 
     { 
      sql = "UPDATE accounts SET password='" + Password + "', proxy='" + Proxy + "', description='" + Description + "' WHERE (email='" + Email + "' AND type='dev');"; 
      retString = "Updated account"; 
     } 

     using (SQLiteConnection dbconn = new SQLiteConnection("Data Source=" + Form1.DBNAME + ";Version=3;")) 
     { 
      dbconn.Open(); 
      using (SQLiteCommand sqlcmd = new SQLiteCommand(sql, dbconn)) 
      { 
       sqlcmd.ExecuteNonQuery(); //this is where it locks. Only on update. 
      } 
     } 
     return retString; 
    } 

    //Test to see if Email exists as account 
    public bool AccountExists() 
    { 
     int rCount = 0; 
     String sql = "SELECT COUNT(email) FROM accounts WHERE email='" + Email + "' AND type='dev';"; 
     using (SQLiteConnection dbconn = new SQLiteConnection("Data Source=" + Form1.DBNAME + ";Version=3;")) 
     { 
      dbconn.Open(); 
      using (SQLiteCommand sqlcmd = new SQLiteCommand(sql, dbconn)) 
      { 
       rCount = Convert.ToInt32(sqlcmd.ExecuteScalar()); 
      } 
     } 
     if (rCount > 0) 
      return true; 
     return false; 
    } 
+0

ただハングアップしますか? 「接続は既に開いています」のようなエラーはありませんか? – Sergio

+2

コード5は通常、接続が既に開いていることを意味します。私は個人的には、アプリケーションが実行されている間はSQLiteへの接続を開いたままにして、アプリケーションが閉じられたときに閉じるようにします。 SQLiteはサーバーレスです。つまり、それは単なるファイルであり、毎回それを開くと私にはあまり意味がありません。 – Alex

+0

おそらくupdateコマンドは、AccountExists関数のselectコマンドがまだアクティブであると考えている間、アカウントテーブルに書き込もうとしています。 WriteTODB関数内で2回目の接続を開かずにコードを書き直してみてください。 – jambonick

答えて

0

ああ私は気が気になりません。私は関連するすべてのコードを投稿したと思ったが、投稿したコードはすべてうまくいきました。私が持っていた:

SQLiteDataReader dbReader = sqlcmd.ExecuteReader() 

代わりの

using (SQLiteDataReader dbReader = sqlcmd.ExecuteReader()) 

を別の関数で。ロックが行われた場所だったので、UPDATEの問題だと思っていました。応答してくれてありがとうとうまくいけば、これは最初にSQLiteで()ブロックを使うことをみんなに思い出させる!

関連する問題