我们有一个主要的VB6交易应用程序,它使用MS Access(不要问!)它总是将交易爆炸到MS Access数据库。
此处的其余基础架构已大大改进,我希望定期读取此Access数据库并将任何新交易复制到SQL Server数据库中。
执行此操作所需的SQL和C#非常简单。
但我想确保以不锁定Access数据库或导致VB6应用程序出现问题的方式执行此操作。换句话说,当从Access填充我的DataTable时,我不想锁定数据库并阻止VB6应用程序写入它。我似乎记得从旧的ADO中可以看到你可以用于此目的的共享模式。
我应该使用哪种连接字符串来完成此操作?
答案 0 :(得分:1)
基于Matt的答案,我建议adOpenForwardOnly和adLockReadonly的组合:ForwardOnly因为你只需要将这些交易插入SQL Server,而Readonly所以你不会锁定其他进程(还有什么会打到这些表?)。幸运的是,这些是默认选项。 :)
答案 1 :(得分:0)
只是一个想法......但您是否考虑过升级数据库以使表本身实际存储在SQL Server中并且Access成为前端?这已经有一段时间了,但是如果我没记错的话,Access应该有一个向导(哎呀!)来帮助你做到这一点。
使用旧的ADO,您可以将光标或锁定类型机制设置为以下之一:
光标类型
adOpenForwardOnly 此类型的游标只能用于向前移动记录集。当要填充列表框或组合框时使用此选项。
adOpenKeyset 这是我们期望大型记录集时使用的最佳游标类型,因为在对可能影响我们的记录集的数据进行更改时,我们不会收到通知。
adOpenDynamic 此游标允许我们查看影响我们记录集的其他用户所做的所有更改。它是最强大的光标类型,但速度最慢。
adOpenStatic 当我们有一个小记录集时,静态游标非常有用。
锁定类型
adLockReadonly 当记录集中不允许添加,更新或删除时使用此锁定模式
adLockPesimistic 在悲观锁定中,一旦编辑开始就会锁定记录,并在编辑完成之前保持锁定状态。
adLockOptimistic 在记录上调用update方法时会发生这种情况。即使在编辑时记录也会解锁,但在将更改保存到数据库时会暂时锁定记录
adLockBatchOptimistic 此选项允许我们在更新一批记录时执行乐观锁定
不确定这究竟是如何转化为.NET世界的......但也许这可以让你指向正确的方向。
答案 2 :(得分:0)
连接到数据库的第一个用户确定用于该数据库打开期间的锁定模式。
将连接字符串中的模式设置为“Read”应该可以解决问题。
"Data Source=C:\IronSpeed\TestAccessDB\TestTypes.mdb;
Jet OLEDB:Database Locking Mode=1;
Mode=Read"
一些可能有帮助的链接。
答案 3 :(得分:0)
您有多种解决方案,例如通过ADO(OLEDB)连接打开只读记录集。这些记录集甚至可以在本地保存/存档为xml文件以供进一步使用。
但最简单的解决方案是制作原始mdb文件的副本(即使某些表被锁定,也可以随时进行)。然后,您可以使用复制的数据库执行任何操作,而不会有任何干扰正在运行的VB6应用程序的风险。