2016-07-05 9 views
2

私のコードに問題があります。 私のSQLiteデータベースでいくつかの行を削除したいのですが、 "データベースがロックされています"例外が発生します。 this postのような記事をいくつか読んだが、私の問題はまだここにある。私はラインcmdUpdate.ExecuteNonQuery();の「データベースがロックされている」例外を取得SQLiteとC#で "データベースがロックされています"

using (var c = new SQLiteConnection(_connectionSQLite)) 
{ 
    c.Open(); 

    if (c.State == ConnectionState.Open) 
    { 
     var reqExist = string.Concat("SELECT id FROM ... "); 
     using (var cmdExist = new SQLiteCommand(reqExist, c)) 
     { 
      var reqUpdate = string.Concat("UPDATE ... WHERE id = ", cmdExist.ExecuteScalar()); 

      using (var cmdUpdate = new SQLiteCommand(reqUpdate, c)) 
      { 
       cmdUpdate.ExecuteNonQuery(); 
      } 
     } 
    } 

    c.Close(); 
} 

は、ここに私のコードです。私は同じ結果をDELETE FROMに置き換えようとしましたが、SELECTで動作します。私のコードで何が問題なのか分かりません。

ありがとうございました。

+3

@AbhilashRVankayala - ひどいアドバイスです。ネストされたusingステートメントには何も問題はありません。そのようなステートメント(またはequiv try-finallys)は、問題の原因の1つである適切なリソースの廃棄を保証するために必要です。 – antiduh

+0

同じデータベースに複数の接続を同時に開いていますか? –

+0

ExecuteScalarがidを見つけられない場合、不快なことが起こります。 ExecuteScalarの復帰を連結するのは巧妙な考えですが、... – Steve

答えて

1

最初のコマンドを実行する前に、2番目のコマンドを実行しようとしています。 cmdExistは、cmdUdpdateを実行しようとすると、データベースがロックされている可能性があります。

コマンドのusingブロックがネストされないように、コードをリファクタリングする必要があります。

Does SQLite lock the database file on reads?私はあなたが他の場所からデータベースを開いていないことを確認したいと思います。それはまだ考えられる原因と思われる。これが成功した場合、あなたがいることを知っている

UPDATE ... idは=(...からIDを選択)

を:

+0

私は各リクエストを分けていますが、各コマンドの後に処分してもまだ問題があります。 – BlackAlpha

+0

この回答をありがとう、私は私のコマンドのブロックを使用してネストしていた、それは私を狂って運転していた、あなたの答えは助けた。 – Brcinho

0

は、このような単一ステートメントに更新し、あなたの選択を簡素化してみ選択と更新の間の相互作用によるものでした。つまり、個別の選択では、更新が実行されたデータベースで共有ロックが開かれている必要があります。

データベースがロックされているためにこの結合されたステートメントが失敗した場合、選択したものではなく、別のものが更新をブロックしていることがわかります。アプリケーションにデータベースロックの失敗を引き起こす何かがあります。

4

皆、ありがとうございます。 挿入/更新する前に他の関数で2つのリーダーを.dispose()するだけで動作します。

関連する問題