我将数据插入带有后台进程的表中。当我尝试在表中插入数据时,我收到以下错误:
无法更新;目前已被锁定。
在我的情况下,这个表(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;
}
}
答案 0 :(得分:0)
我向甜甜圈下注美元DeleteUpdateRecordFromTable
正在锁定桌子上。
select
应该没问题,因为它没有改变任何东西(并且取决于你的数据库是否设置了乐观锁定)。但是,insert
可能会阻止来自delete
的锁定。
为了在执行插入操作之前检查表是否已锁定,您可能必须使用oledbTransaction
并为delete
和insert
设置正确的交易;然后根据需要处理try / catches中的问题。