首先抱歉我的英语不好但我会尽我所能。
现在我正在使用Access 2007编写.net应用程序作为数据存储区。
简而言之:我有两个主题。一个线程将带有事务的行插入表中。另一个线程以固定间隔更新许多行。
主题1
Database db = _loggingDatabase;
using (DbConnection conn = db.CreateConnection())
{
conn.Open();
DbTransaction txn = conn.BeginTransaction();
try
{
string qryInsert = "Insert this";
DbCommand cmdIns = db.GetSqlStringCommand(qryInsert);
db.ExecuteNonQuery(cmdIns, txn);
txn.Commit();
}
catch (Exception ex)
{
txn.Rollback();
throw ex;
}
finally
{
conn.Close();
}
主题2
Database db = _loggingDatabase;
using (DbConnection conn = db.CreateConnection())
{
conn.Open();
DbTransaction txn = conn.BeginTransaction();
try
{
string qryUpdate = "Update that";
DbCommand cmdUpdt = db.GetSqlStringCommand(qryUpdate);
db.ExecuteNonQuery(cmdUpdt, txn);
txn.Commit();
}
catch (Exception ex)
{
txn.Rollback();
throw ex;
}
finally
{
conn.Close();
}
如果我触发插入许多记录,我将收到一个System.Data.OleDb.OleDbException,其中显示:“无法更新;当前已锁定”。我试图将Connectionstring更改为
connectionString="Provider=Microsoft.ACE.OLEDB.12.0; Data Source=datastore.accdb; Jet OLEDB:Database Locking Mode=1;"
对我的应用程序行为没有影响。我决定使用这些事务来避免混乱的插入和更新。
有解决方法吗? 我究竟做错了什么? 我可以将我的交易插入Access的某种交易队列吗? 为什么Access不通过itselft这样做?
答案 0 :(得分:2)
Stefan Gruber问:
我可以将我的交易插入某些人吗? 那种事务队列进入Access? 为什么Access不这样做 itselft?
我认为您无法理解Jet数据库引擎。首先,澄清一下:MS可能会使用“MS Access”作为其ODBC和OLEDB连接字符串中的名称,但在这种情况下您根本不使用Access - 只是Access的默认数据库引擎Jet。
Jet不是服务器数据库引擎。也就是说,客户端和存储数据的MDB文件之间没有服务器进程。 MDB文件的所有“用户”都通过文件系统访问它。为了管理多用户访问,有一个锁定文件(LDB文件),用于跟踪锁定的表/记录以及锁定的类型。 Jet检查LDB文件以确定它能做什么和不能做什么。
现在,由于没有服务器级进程来管理与磁盘数据的所有交互,因此不可能有任何编组访问MDB文件的请求。你的应用必须自己做。
如果不满意,那么您使用的是错误的数据存储。
答案 1 :(得分:0)
在这种情况下使用MARS(多个活动结果集)。 在网上搜索如何实施MARS。
答案 2 :(得分:0)
不确定这是否会有所帮助,但本文可能有助于解释如何处理“Microsoft Jet数据库引擎具有读取缓存和延迟写入”这一事实: