【问题标题】:Reset autonumber seed重置自动编号种子
【发布时间】: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 页面

标签: sql ms-access vb6 jet


【解决方案1】:

请参考以下文章,它包含一个您可以添加到您的访问项目以执行重置种子的方法。过去几次,这对我来说是一个节省:

http://allenbrowne.com/ser-40.html

除此之外,它还对此类问题的原因和潜在解决方案进行了解释和洞察。

【讨论】:

  • 我绝不会为了支持一个功能而添加引用——后期绑定会是一种更好的方法。但我不确定你能得到比使用 DAO 紧凑型和 ALTER TABLE 种子重置更多的东西。无论如何,我无法想象运行该代码而不进行压缩。
【解决方案2】:

您可能还需要确保您的数据库设置为使用 ANSI 92,以便将 COUNTER 识别为合法数据类型。

在 Access 2007 中,转到 Access 选项、对象设计器、SQL Server 兼容性语法 (ANSI 92) 进行设置。

【讨论】:

  • 您可以使用 ADO 执行 ALTER TABLE 以避免必须设置 SQL 92 模式。
【解决方案3】:

您也许可以通过压缩/修复来解决问题:

In Access 2010:  Compact and Repair Database on the Database Tools ribbon.
In Access 2007:  Office Button | Manage.
In earlier versions:  Tools | Database Utilities.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2012-01-26
    • 2019-05-10
    • 2014-04-01
    • 2021-02-22
    • 2011-01-28
    相关资源
    最近更新 更多