通过OleDb(C#)将Access 2010记录锁定设置为乐观锁定

3
我正在使用C#通过OleDb与Access 2010进行通信。 如何从C#设置锁定类型以使用乐观锁定?
如果有人想知道,我正在使用以下连接字符串连接到我的Access数据库:
// Set the data source string.
_sqlCon = new OleDbConnection(
    String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=True", databasePath)
);

更新 #0

我在微软MSDN网站上找到了一些关于ADOadLockOptimistic的信息(https://msdn.microsoft.com/en-us/library/ee252458(v=bts.10).aspx),但这可能完全不相关,因为我正在使用OLE

更新 #1

我尝试将以下内容添加到连接字符串中:

@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=True;LockType=3;"
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=True;Lock Type=3;"
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=True;LockType=adLockOptimistic;"
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=True;Lock Type=adLockOptimistic;"

导致以下异常的原因:

找不到可安装的 ISAM。

我本来以为它不会起作用,但是嘿,如果你不尝试,谁知道呢。

更新 #2

如果可以在我的 Access 数据库中定义此属性,则此解决方案也完全可以!然而,这应该是一个数据库设置,而不是特定于客户端的设置,而且 如果 可以从 C#来完成,那么我更喜欢这种方法。

上下文信息:

我正在对我的 Access 数据库(通过网络)进行并发压力测试。 我有大约 20 多个客户端(小的 C# 程序),它们正在尽可能快地读取相同记录相同表格 中的数据。 这会产生很多database is in 'Admin' mode by .. 异常,我在我的 C# 客户端中捕获这些异常。 我想能够同时读取这些记录以解决一个应用程序中的更大问题。 我可以通过切换到一个“真正的”数据库系统轻松解决这个问题,但不幸的是这是不可能的。

如果以上问题以任何其他方式解决,我仍然非常有兴趣了解如何告诉 Access 使用不同的锁定类型(从 OleDb/C#)。


1
你尝试过使用带有 System.Data.IsolationLevel.ReadUncommittedOleDbTransaction 吗? - Gord Thompson
不,我不知道那是什么,但我明天会在工作中查看它。谢谢你给我的指引! - rotgers
只是提出一个可能性(或者不是,取决于您的配置):使用Jet驱动程序连接(Access的“本地”驱动程序)也是一种选择。这还允许您通过使用Jet OLEDB:Database Locking Mode=1连接字符串设置来启用行级锁定(这与乐观锁定不同,但它是一个因素)。 - Jeroen Mostert
@JeroenMostert 我已经尝试了您的建议,但仍然遇到相同的异常。据我所知,Access默认情况下已经按行级别进行锁定。还是感谢您的建议! - rotgers
@GordThompson 经过一些谷歌搜索和测试,我能够在 SQL 语句中实现 UPDATE 和 INSERT。但是对于从数据库检索数据,我遇到了一些麻烦。此外,我已经想到了一个解决我的上下文信息问题的方法,我现在要进行测试。这仍然有一个问题未解决:我如何从 C#/OleDb 更改 Access 2010 使用的锁定类型? - rotgers
显示剩余3条评论
1个回答

3

Gord Thompson写道:

您尝试过使用带有System.Data.IsolationLevel.ReadUncommitted的OleDbTransaction吗?

锁定和事务隔离级别是相互关联的。例如,IsolationLevel.ReadUncommitted的描述表示“不发出共享锁并且不允许独占锁”(参考:这里)。我没有看到System.Data.OleDb中似乎与(COM)ADO Recordset对象的adLockOptimistic选项相匹配的选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接