SQLite データベース ロック例外 質問する

SQLite データベース ロック例外 質問する

私はデータベースがロックされています例外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処分しないこれらのオブジェクトを適切に処理しないと、現在表示されているような問題が発生します。

おすすめ記事