0

一部の端末からアクセス テーブルを更新する WebService があります (10)。更新しようとすると、エラー ログから次のエラーが表示されます。

Could not Update; Currently locked

成功する端末もあれば、失敗する端末もあります。

私は次のように更新します:

using (Conn = new OleDbConnection(Work_Connect))
         {
            Conn.Open();
            foreach (DataRow R in ds.Tables["MyCount"].Rows)
            {
                    U_ID = ID;
                    U_Bar = R["Bar"].ToString().Trim();
                    U_Qty = R["Qty"].ToString().Trim();
                    U_Des = R["Des"].ToString().Trim();

                    SQL  = "INSERT INTO MyTbl(ID,Bar,Qty,Des)VALUES('";
                    SQL += Convert.ToInt32(ID) + "','" + U_Bar + "','" + Convert.ToDouble(U_Qty) + "','" + U_Des + "')";
                    OleDbCommand Cmd2 = new OleDbCommand(SQL, Conn);
                    Cmd2.CommandText = SQL;
                    Cmd2.ExecuteNonQuery();
              }
           }
           GC.Collect();
           return true;
4

2 に答える 2

1

提案:

  1. クエリをパラメーター化されたクエリに変換して、引用符で奇妙になる可能性を回避します。(テキストを数値に変換してから、SQL ステートメントでそれらを単一引用符で囲んでいます。意味がありません。)

  2. 各呼び出しでガベージ コレクションを強制しないでください。ここの MSDN の記事によると、「Collect を呼び出すことでガベージ コレクションを強制することは可能ですが、ほとんどの場合、パフォーマンスの問題が発生する可能性があるため、これは避ける必要があります。」

代わりに次のようにしてみてください。

using (Conn = new OleDbConnection(Work_Connect))
{
    Conn.Open();
    foreach (DataRow R in ds.Tables["MyCount"].Rows)
    {
        U_ID = ID;
        U_Bar = R["Bar"].ToString().Trim();
        U_Qty = R["Qty"].ToString().Trim();
        U_Des = R["Des"].ToString().Trim();

        SQL  = "INSERT INTO MyTbl (ID,Bar,Qty,Des) VALUES (?,?,?,?)";
        using(OleDbCommand Cmd2 = new OleDbCommand(SQL, Conn))
        {
            // Cmd2.CommandText = SQL;  redundant, the 'new' set the .CommandText
            Cmd2.Parameters.AddWithValue("?", Convert.ToInt32(ID));
            Cmd2.Parameters.AddWithValue("?", U_Bar);
            Cmd2.Parameters.AddWithValue("?", Convert.ToDouble(U_Qty));
            Cmd2.Parameters.AddWithValue("?", U_Des);
            Cmd2.ExecuteNonQuery();
        }
    }
    Conn.Close();
}
// GC.Collect();  // disabled for test purposes
return true;
于 2013-06-02T12:12:57.310 に答える