3

我们有一个使用 MS Access 的主要 VB6 交易应用程序(不要问!)它总是将交易爆破到 MS Access 数据库中。

这里的其他基础设施已经有了很大的发展,我想定期阅读这个 Access 数据库并将任何新交易复制到 SQL 服务器数据库中。

执行此操作所需的 SQL 和 C# 非常简单。

但我想确保我这样做不会锁定 Access 数据库或导致 VB6 应用程序出现问题。换句话说,当从 Access 填充我的 DataTable 时,我不想锁定数据库并阻止 VB6 应用程序写入它。我似乎记得从旧的 ADO 中可以使用一些共享模式来实现此目的。

我应该使用 .NET 中的哪种连接字符串来完成此操作?

4

4 回答 4

1

为了建立马特的答案,我建议将 adOpenForwardOnly 和 adLockReadonly 组合起来: ForwardOnly 因为您只需将这些交易插入到 SQL Server 中,而 Readonly 则不会锁定其他进程(还有什么会影响这些表?)。幸运的是,这些是默认选项。:)

于 2008-11-14T16:07:28.513 回答
0

You have multiple solutions for that like opening read-only recordsets through ADO(OLEDB) connections. These recordsets can even be locally saved/archived as xml files for further use.

But the most trivial solution would be to make a copy of your original mdb file (which can be done at any time even if some of the tables are locked). You can then do whatever you want with the copied database, without any risk of interference with the running VB6 application.

于 2008-11-16T21:26:25.733 回答
0

只是一个想法……但是您是否考虑过升级数据库,以便表本身实际上存储在 SQL Server 中,而 Access 只是成为前端?已经有一段时间了,但如果我没记错的话,Access 应该有一个向导(糟糕!)来帮助您执行此操作。

使用旧的 ADO,您可以将光标或锁定类型机制设置为以下之一:

光标类型

adOpenForwardOnly这种类型的游标只能用于在记录集中向前移动。当要填充列表框或组合框时使用此选项。

adOpenKeyset当我们期望有一个大的记录集时,这是最好的游标类型,因为当对可能影响记录集的数据进行更改时,我们不会收到通知。

adOpenDynamic这个游标允许我们查看其他用户所做的影响我们记录集的所有更改。它是最强大的游标类型,但速度最慢。

adOpenStatic当我们有一个小的记录集时,静态游标很有用。

锁型

adLockReadonly当不允许从记录集中添加、更新或删除时使用此锁定模式

adLockPesimistic在悲观锁定中,记录在编辑开始时被锁定并保持锁定直到编辑完成。

adLockOptimistic这发生在对记录调用更新方法时。即使在编辑时记录也被解锁,但在将更改保存到数据库时暂时锁定

adLockBatchOptimistic此选项允许我们在更新一批记录时执行乐观锁定

不确定这如何准确地转化为 .NET 世界……但也许这可以让您指出正确的方向。

于 2008-11-14T15:55:42.047 回答
0

连接到数据库的第一个用户确定在该数据库打开期间使用的锁定模式。

将连接字符串中的模式设置为“读取”应该可以解决问题。

"Data Source=C:\IronSpeed\TestAccessDB\TestTypes.mdb;
Jet OLEDB:Database Locking Mode=1;
Mode=Read"

一些可能有帮助的链接。

于 2008-11-14T16:03:21.173 回答