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;
}
ただハングアップしますか? 「接続は既に開いています」のようなエラーはありませんか? – Sergio
コード5は通常、接続が既に開いていることを意味します。私は個人的には、アプリケーションが実行されている間はSQLiteへの接続を開いたままにして、アプリケーションが閉じられたときに閉じるようにします。 SQLiteはサーバーレスです。つまり、それは単なるファイルであり、毎回それを開くと私にはあまり意味がありません。 – Alex
おそらくupdateコマンドは、AccountExists関数のselectコマンドがまだアクティブであると考えている間、アカウントテーブルに書き込もうとしています。 WriteTODB関数内で2回目の接続を開かずにコードを書き直してみてください。 – jambonick