私はデータベースがロックされています例外SQLite一部のクエリのみ。
以下は私のコードです: 任意の SELECT ステートメントを実行すると、正常に動作します。テーブル
に対して任意の WRITE ステートメントを実行する場合も、正常に動作します。Jobs
これはうまく動作します:
ExecuteNonQuery("DELETE FROM Jobs WHERE id=1");
しかし、同じようにテーブルに対してクエリを実行すると、Employees
例外が発生します。データベースがロックされています
例外が発生します:
ExecuteNonQuery("DELETE FROM Employees WHERE id=1");
私の機能は次のとおりです:
public bool OpenConnection()
{
if (Con == null)
{
Con = new SQLiteConnection(ConnectionString);
}
if (Con.State == ConnectionState.Closed)
{
Con.Open();
//Cmd = new SQLiteCommand("PRAGMA FOREIGN_KEYS=ON", Con);
//Cmd.ExecuteNonQuery();
//Cmd.Dispose();
//Cmd=null;
return true;
}
if (IsConnectionBusy())
{
Msg.Log(new Exception("Connection busy"));
}
return false;
}
public Boolean CloseConnection()
{
if (Con != null && Con.State == ConnectionState.Open)
{
if (Cmd != null) Cmd.Dispose();
Cmd = null;
Con.Close();
return true;
}
return false;
}
public Boolean ExecuteNonQuery(string sql)
{
if (sql == null) return false;
try
{
if (!OpenConnection())
return false;
else
{
//Tx = Con.BeginTransaction(IsolationLevel.ReadCommitted);
Cmd = new SQLiteCommand(sql, Con);
Cmd.ExecuteNonQuery();
//Tx.Commit();
return true;
}
}
catch (Exception exception)
{
//Tx.Rollback();
Msg.Log(exception);
return false;
}
finally
{
CloseConnection();
}
}
これは例外です: 103行目:Cmd.ExecuteNonQuery();
例外が見つかりました: タイプ: System.Data.SQLite.SQLiteException メッセージ: データベースがロックされています データベースがロックされています ソース: System.Data.SQLite
スタック トレース: System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)、System.Data.SQLite.SQLiteDataReader.NextResult()、System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd、CommandBehavior behave)、System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)、System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()、TimeSheet6.DbOp.ExecuteNonQuery(String sql)、d:\Projects\C# Applications\Completed Projects\TimeSheet6\TimeSheet6\DbOp.cs: 行 103
ベストアンサー1
途中で接続が開いたままになっています。 と を削除してOpenConnection
、次のようにCloseConnection
変更しますExecuteNonQuery
。
using (SQLiteConnection c = new SQLiteConnection(ConnectionString))
{
c.Open();
using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
{
cmd.ExecuteNonQuery();
}
}
さらに、あなたのやり方を変えて読むこれにデータ:
using (SQLiteConnection c = new SQLiteConnection(ConnectionString))
{
c.Open();
using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
{
using (SQLiteDataReader rdr = cmd.ExecuteReader())
{
...
}
}
}
しようとしません、ここでのように接続プールを自分で管理するのは困難です。まず、これはあなたがコーディングしたものよりもはるかに複雑ですが、第二に、オブジェクト内で既に処理されていますSQLiteConnection
。最後に、を活用していない場合はusing
、処分しないこれらのオブジェクトを適切に処理しないと、現在表示されているような問題が発生します。