Access 数据库 (DDL) 的批量更新。可能的?

Posted

技术标签:

【中文标题】Access 数据库 (DDL) 的批量更新。可能的?【英文标题】:Batch updating of an Access database (DDL) . Possible? 【发布时间】:2012-01-27 21:06:29 【问题描述】:

我已经接管了对使用 Access 数据库的 VB .Net 应用程序的支持。现在我发现编写此应用程序的开发人员没有在数据库中表的主键列上创建任何唯一索引。因此,实际上没有一个主键字段被标记为 access 中的主键,因此 Access 不会执行重复检查。此外,在 Access 中,主键列不会使用 AutoNumber 类型自动递增,而是开发人员使用这样的查询将行插入到表中:

插入用户(pkid、名字、姓氏、城市) 选择 iif(isnull(max(pkid)),0,max(pkid))+1, [@strFirstName], [@strSurname], [@strCity], 来自用户;

这个应用程序通常作为一个网络应用程序运行,最多有 40 人同时使用该应用程序,再加上已经提到的设计问题,这导致了严重的并发问题,多个用户被分配了相同的主键值。这== 大问题。 :(

现在我需要解决这个问题(猜猜我这个周末会做什么!太好了。)。我考虑过在调用 Access 插入查询的代码周围使用互斥锁;不是最整洁的解决方案,但它会是最快的。但最终,我希望更正数据库并拥有适当的主键值。但是该应用程序目前在大约 15 个不同的站点上运行,所以我需要对数据库进行某种批量更新。

我对 Access 不是很熟悉(这是我第一次使用 Access),如果这是一个菜鸟问题,我很抱歉,但我需要一个快速的解决方案。如果我在使用我熟悉的 Sybase 或 MSSql 数据库时遇到此问题,我将创建一个 SQL 批处理,其中包含必要的 DDL 命令来更正数据库。那么问题来了,是否可以在 Access 中创建一个可以从批处理文件启动的 SQL 脚本?如果没有,我怎么能创建一个可以在不同站点执行的“补丁”来更新各自的数据库。

【问题讨论】:

【参考方案1】:

您可以在 VBA 中轻松地运行 SQL,但我认为创建一个带有自动增量的空 Access 数据库来代替当前 ID 列并附加所有数据是最简单的,因为您无法将字段更改为自动增量包含任何数据。

【讨论】:

谢谢,雷穆。我会走这条路。【参考方案2】:

Access 是一个基于文件的数据库,因此如果您想向 DDL 发送更新,您需要发送一个新的 .mdb。

【讨论】:

这不是真的。 Microsoft Access 支持 DDL 命令:link。仅仅因为 Microsoft Access 是基于文件的,与它对 DDL 的支持无关。 查看我的 windows 脚本示例。根据我的示例显示,您甚至不必在 Windows 框中安装 Access 即可添加 PK 列。 是的,我知道它支持 DDL 命令,但是以您想要的方式创建新的 mdb 并粉碎旧的 mdb 比跟踪所有 ddl 更改并希望您完成所有操作更容易正确的。基于服务器的数据库是不同的 - 您无法选择将新数据库附加到电子邮件并让人们替换现有文件。【参考方案3】:

实际上,您可以使用 windows 脚本。在记事本中键入以下内容,然后另存为 ADDPK.vbs。

Set dbeng = CreateObject("DAO.DBEngine.120")
strMdbFile = "C:\database53.accDB"
Set db = dbeng.OpenDatabase(strMdbFile)

strSql = "ALTER TABLE FAXBOOK add column ID COUNTER primary key"
db.Execute strSql

然后从 windows 命令行,你去:

C:\>c:\windows\syswow64\wscript.exe "c:\addpk.vbs"

您在这里使用的是 32 位版本,因为我假设是 32 位访问。

如果您使用的是 pre-access 2010,请使用:

Set dbeng = CreateObject("DAO.DBEngine.36")
strMdbFile = "C:\database53.mdb"
Set db = dbeng.OpenDatabase(strMdbFile)
etc.

我在上面使用的是内置vbs脚本的windows,但是你可以使用javascriting代替上面的(只需将上面的文件保存为.js)。

如果你使用 mdb 文件,那么上面的内容甚至可以在没有安装任何软件的 windows 机器上运行。换句话说,一个干净的 windows xp 机器将运行上述 windows 脚本,甚至无需安装 Access。

如上所述,对于上述 JET 示例? JET 自 windows 98SE 起默认安装在 windows 上,所以上面的 mdb 脚本甚至可以在这些盒子上运行。 (即使在干净的处女安装上,上面的脚本也会运行)。

对于以后的版本,如果您使用 accDB 文件,那么您需要 ACE 数据引擎。默认情况下,这不会在 Windows 上安装 - 您必须安装它,或者您可以希望/假设 Access 已安装。如果您愿意,可以从 Access 单独下载该引擎。并且有 64 位版本可用。

所以说到底,您不需要 Access,您可以使用基本 Windows 脚本来更新这些数据库。

【讨论】:

但是,一旦将 id 列添加到已经包含数据的表中,它将填充最不可能对现有关系有用的数字,而将整个数据集添加到空表中将允许用户使用现有的唯一数字 ID 填充自动增量列。

以上是关于Access 数据库 (DDL) 的批量更新。可能的?的主要内容,如果未能解决你的问题,请参考以下文章

批量生成DDL脚本

两个表,根据条件批量更新其中一个表的某一列数据。(高分求救,在线等待。)

使用 ReactiveMongoTemplate 批量更新

关于ACCESS数据库插入或更新数据的溢出问题

MySQL online DDL的两个坑

MySQL online DDL的两个坑