【发布时间】:2010-02-18 18:01:34
【问题描述】:
我有一个 VB6/Access 应用程序,它偶尔会遇到自动编号字段种子错误的问题。
假设有一个带有自动编号字段 ID 的表 MYTABLE(这也是主键)。假设目前 ID 的最大值为 1000。当应用程序插入新记录(未明确提供 ID 值)时,由于某种原因,它决定下一个自动编号字段值为 950(而不是应为的 1001 ) - 因此发生主键冲突错误。
我找到了一篇描述我的症状的知识库文章:http://support.microsoft.com/kb/884185。简而言之,他们建议运行查询:
ALTER TABLE MYTABLE ALTER COLUMN ID COUNTER(1001,1)
当我尝试这样做时,它会因“无效的字段数据类型”而失败
如果我在 Access 中打开数据库并进行压缩/修复,问题就会得到解决,但我需要能够在应用程序内部修复此类问题:它安装在全球数千台 PC 上,并询问人们不能使用 Access 进行压缩/修复。
我使用 DAO DBEngine.CompactDatabase 在应用程序内部执行压缩/修复,但它不能解决种子问题,需要一些额外的技巧。
有解决方案的想法吗?
【问题讨论】:
-
出于好奇,您要在运行
ALTER TABLE MYTABLE ALTER COLUMN ID COUNTER(1001,1)ALTER TABLE MYTABLE ALTER COLUMN ID COUNTER(1001,1)之前关闭表吗? -
如果代码在 Access MDC/ACCDB 中,语言是 VBA,而不是 VB6。请澄清。
-
@Otaku:是的,确定这个查询在 Access 中执行和通过 DAO 执行时都会失败。奇怪的是:如果在 Access 中删除自动编号字段,然后创建完全相同的字段,则查询有效。看起来有不同风格的自动编号类型,但我不明白这种区别是什么
-
@Remou: VB6/Access 应用程序 = 用 VB6 编写的应用程序,使用 Access 数据库作为其后端
-
您不应该偶尔遇到种子问题。运行您的应用程序的系统是否已完全修补 Windows 2000 及更高版本?系统上运行的 msjet40.dll 的版本是什么?我建议记录版本,看看那里是否有任何问题。我所做的是使用各种可用的 API 调用,并检查关键 dll msjetxx.dll 的版本号和日期/时间,以确保它与我系统上的内容相匹配。请参阅我的网站 www.granite.ab.ca\access\verifyjetsp.htm 上的验证安装了适当的 Jet Service Pack 页面