无法更新;目前锁定

时间:2016-12-22 12:46:09

标签: c# wpf ms-access

我将数据插入带有后台进程的表中。当我尝试在表中插入数据时,我收到以下错误:

  

无法更新;目前已被锁定。

在我的情况下,这个表(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 :(得分:0)

我向甜甜圈下注美元DeleteUpdateRecordFromTable正在锁定桌子上。

select应该没问题,因为它没有改变任何东西(并且取决于你的数据库是否设置了乐观锁定)。但是,insert可能会阻止来自delete的锁定。

为了在执行插入操作之前检查表是否已锁定,您可能必须使用oledbTransaction并为deleteinsert设置正确的交易;然后根据需要处理try / catches中的问题。