2016-12-22 120 views
0

私はバックグラウンドプロセスでテーブルにデータを挿入しています。更新できませんでした。現在ロックされています

Could not update; currently locked.

私の場合は

この表(JobsTemp)別のプロセスが、アプリケーションの他のプロセスによって操作で任意の場所を使用していません:私は、私は次のエラーを取得するテーブルにデータを挿入しようとすると、同じデータベースのテーブルを使用しています。

  • このバグの原因は何ですか。
  • データベースがロックされているかどうかを確認できますか?

私たちは、MS Access 2003データベースにWPFアプリケーションを使用してデータを挿入しようとしています。どのようにプログラムでこれを修正するのですか?

private static string dbFile = 
    Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) 
     + "\\AppData\\LocalAccess.mdb"; 
private static string ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 
    + dbFile + ";"; 
public bool SalesTPJob_Insert_InAccessDB(DataTable DT) 
{ 
    bool flag = true; 
    try 
    { 
     if (DT != null) 
     { 
      if (DT.Rows.Count > 0) 
      { 
       string deleteQuery = "DELETE FROM JobsTemp"; 
       DeleteUpdateRecordFromTable(deleteQuery); 
       string SQL = "SELECT top 1 * FROM JobsTemp"; 
       string INSERT = "INSERT INTO " 
        + "JobsTemp([JobId],[CustomerId],[JobName],[JobAddress],[City]," 
        + "[State],[Zip],[IsExisting],[Area])" 
        + " VALUES (@JobId,@CustomerId,@JobName,@JobAddress,@City,@State," 
        + "@Zip,1,@Area)"; 

       OleDbConnection OleConn = new OleDbConnection(ConnString); 
       OleDbDataAdapter OleAdp = new OleDbDataAdapter(SQL, OleConn); 

       OleAdp.InsertCommand = new OleDbCommand(INSERT); 

       OleAdp.InsertCommand.Parameters.Add("@JobId", OleDbType.VarChar, 
        1008, "JobId"); 
       OleAdp.InsertCommand.Parameters.Add("@CustomerId", OleDbType.VarChar, 
        1008, "CustomerId"); 
       OleAdp.InsertCommand.Parameters.Add("@JobName", OleDbType.VarChar, 
        1008, "JobName"); 
       OleAdp.InsertCommand.Parameters.Add("@JobAddress", OleDbType.VarChar, 
        1008, "JobAddress"); 
       OleAdp.InsertCommand.Parameters.Add("@City", OleDbType.VarChar, 
        1008, "City"); 
       OleAdp.InsertCommand.Parameters.Add("@State", OleDbType.VarChar, 
        1008, "State"); 
       OleAdp.InsertCommand.Parameters.Add("@Zip", OleDbType.VarChar, 
        4000, "Zip"); 
       OleAdp.InsertCommand.Parameters.Add("@Area", OleDbType.VarChar, 
        1008, "Area"); 

       OleAdp.InsertCommand.Connection = OleConn; 
       OleAdp.InsertCommand.Connection.Open(); 
       int i = OleAdp.Update(DT); 
       OleAdp.InsertCommand.Connection.Close(); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     LogFile(ex.ToString()); 
     flag = false; 
    } 
    return flag; 
} 

JobsTempは他のプロセスで使用されていません。

public int DeleteUpdateRecordFromTable(string query) 
    { 
     using (OleDbConnection OleConn = new OleDbConnection(ConnString)) 
     { 
      int i = 0; 
      try 
      { 
       OleConn.Open(); 
       OleDbCommand ac = new OleDbCommand(query, OleConn); 
       i = ac.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       OleConn.Close(); 
       LogFile(ex.ToString()); 
      } 
      return i; 
     } 
    } 
+1

どのデータベースを使用していますか? –

+0

@arifhussainshigri:間違ったタグにもかかわらず - 私はMS-Accessを想定しています。特に、この特定のエラーメッセージのために多くの答えが出てくるようです:https://support.microsoft.com/en-gb/kb/918578 – PaulF

+0

これは間違ったタグではない我々はwpfで使用しています。 –

答えて

0

私はDeleteUpdateRecordFromTableがテーブルの上にロックを残していることをドーナツにドルを賭けると思います。

selectは、何も変更されていないので(データベースがオプティミスティックロックで設定されているかどうかによって)問題なく動作するはずです。しかし、はおそらくdeleteからのロックで窒息している可能性があります。

挿入を実行する前にテーブルがロックされているかどうかを確認するには、を使用し、deleteinsertの適切なトランザクションを設定する必要があります。必要に応じてtry/catchで問題を処理します。

+0

私はDeleteUpdateRecordFromTableメソッドのコードを追加しました。ここでは、 'using'キーワードを使用しています。だから、それは蟻の問題を作成していません。 –

+0

こんにちは、他の情報が必要です。 –

+0

通常の実行ではOleConnを閉じることはありません。あなたは例外で行い、OleConnがガベージコレクションされるときにはそうすべきです(SHOULD)。しかし、あなたはそれがいつ起こるかを知る方法がありません。だから私は(習慣から)明示的に私がそれを終えたときにそれを閉じるだろう。 – BIBD

関連する問題