2008-11-14 69 views
3

我们有一个主要的使用MS Access的VB6交易应用程序(别问!)它总是将交易放到MS Access数据库中。只读访问数据源

这里的基础架构的其他部分已经大幅度地移动了,我想定期读取此Access数据库并将任何新的交易复制到SQL服务器数据库中。

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

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

我应该从.NET使用什么样的连接字符串来完成此操作?

回答

0

只是一个想法...但你有没有想过升级数据库,以便表本身实际上存储在SQL Server和Access只是成为前端?已经有一段时间了,但如果我没有记错,Access应该有一个向导(yuck!)来帮助你做到这一点。

随着老ADO您可以将光标或锁定类型机构设置为以下之一:

游标类型

adOpenForwardOnly这种类型的游标只能用来前移通过记录集。该选项用于填充列表框或组合框。

adOpenKeyset这是光标的时候,我们预计会有大量的记录,因为我们没有被告知更改时,可以影响我们记录的数据进行了使用的最佳类型。

adOpenDynamic此游标可以让我们看到影响我们记录的其他用户所做的所有更改。它是最强大的光标类型,但是最慢的一种。

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

锁类型

ADLOCKREADONLY时,没有添加,更新或删除从记录允许使用这种锁模式

adLockPesimistic在保守式锁定,记录被锁定一旦编辑开始并保持锁定状态直到编辑完成。

ADLOCKOPTIMISTIC当更新方法被调用记录发生这种情况。该记录被解锁即使在编辑但当更改保存到数据库

ADLOCKBATCHOPTIMISTIC该选项允许我们执行的时候,我们正在更新一批记录

不知道乐观锁被暂时锁定这究竟是如何转化为.NET世界......但也许这可以让你指出正确的方向。

+0

我很想将它更新到SQL Server,但不幸的是,这不取决于我。这些人有一个'它的工作谁在乎'的态度 – rc1 2008-11-14 15:58:57

+0

是的,Access确实有一个升迁向导......这是可以忍受的,但如果可行的话,你仍然必须自己修复表格。 – 2008-11-14 16:02:21

+0

更新这个应用程序将需要比升级的向导更多...目前有更多的优先事项。这就是人生! – rc1 2008-11-14 16:03:29

1

要建立在马特的答案,我会建议adOpenForwardOnly和ADLOCKREADONLY的组合:ForwardOnly,因为你只需要插入这些交易到SQL Server,和只读,所以你不锁定其他进程(还有什么会打这些表?)。幸运的是,这些是默认选项。 :)

0

您有多种解决方案,例如通过ADO(OLEDB)连接打开只读记录集。这些记录集甚至可以本地保存/存档为xml文件以供进一步使用。

但最简单的解决方案是制作原始mdb文件的副本(即使某些表被锁定,也可以随时完成)。然后,您可以对复制的数据库执行任何操作,而不会对运行的VB6应用程序造成干扰。