1

我试图在 SQL Server Express 表和生产 Access 版本之间保持活动表的副本同步。在其他表中,我能够擦除 SQL Server 表的内容,并将整个混乱重新插入以捕获所有更改。但是,当我尝试使用此表执行此操作时 - 我得到了信息 - 但 Autonumber 字段从上一次迭代中最后一个未使用的数字递增。经过十几个“同步”操作后,我很危险地接近用完该字段的自动编号。

我尝试从 Microsoft Access 前端应用程序发出“DBCC CHECKIDENT”,这会引发一个错误,即该语句不是以 SELECT、DELETE、PROCEDURE、DROP、ALTER 或类似的东西开头的。此命令在从 SQL Server 管理控制台发出时有效(我在当前测试环境中可以访问的工具,但在应用程序投入生产时不会)。

然后,我使用 DoCmd.RunSQL 命令尝试了“TRUNCATE TABLE”查询,它抛出了链接表不支持该操作的错误(大约)。此表链接到 Microsoft Access 前端(后端表位于 SQL Server Express 上)。

因此,快速总结一下:

  • 前端是 Microsoft Access VBA 应用程序
  • 数据存储在远程计算机上的 SQL Server Express 上
  • 数据表在前端应用程序中链接
  • 当这个应用程序投入生产时,我将无法使用 SQL Server 管理控制台命令,它需要自己运行它的内务管理。
  • DoCmd.RunSQL 和 CurrentDB.Execute 似乎不允许使用 TRUNCATE TABLE - 或 - 'DBCC CHECKIDENT' 命令。
  • 当从 SQL Server 管理控制台发出时,上述两个功能 -DO- 都可以工作 - 请参阅上文,了解为什么这不是一个可行的选项。
  • -所有- 其他表的行为方式与我期望的一样,除了这个之外,它们会根据需要重置它们的缩进字段。

-- 编辑于 08/08/2011 @ 15:08 --

好的 - 我在基于 VBA 的传递查询中尝试了多次尝试,所有这些都导致 ODBC -- 调用失败错误。这是我为处理传递而创建的模块的代码(借用了 dbforums.com 的代码):

Function RunPassThrough(ByVal ConnectionString As String, ByVal SQL As String, Optional ByVal QueryName As String)

    Dim dbs As DAO.Database
    Dim qdf As DAO.QueryDef

    Set dbs = CurrentDb
    Set qdf = dbs.CreateQueryDef
    With qdf
        .Name = QueryName
        .Connect = ConnectionString
        .SQL = SQL
        .ReturnsRecords = (Len(QueryName) > 0)
        If .ReturnsRecords = False Then
            .Execute
        Else
            If Not IsNull(dbs.QueryDefs(QueryName).Name) Then dbs.QueryDefs.Delete QueryName
            dbs.QueryDefs.Append qdf
        End If
        .Close
    End With
    Set qdf = Nothing
    Set dbs = Nothing

End Function

因此,我需要指定一个到数据库的连接字符串;以下所有都失败了:

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;Uid=<my username>;Pwd=<my password>;"

结果:运行时错误 ODBC -- 调用失败(错误 #3146)

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;TRUSTED_CONNECTION=YES;"

结果:运行时错误 ODBC -- 调用失败(错误 #3146)

strConnect = "ODBC;DSN=instkeeper_beta;"

结果:询问我的数据源名称,一旦使用数据源管理面板指定,我得到运行时错误 ODBC -- 调用失败(错误 #3146)

strConnect = "ODBC;Server=ENV980-067\ENVIRON_TEST;Database=instkeeper_test;User ID=<my user name>;Password=<my password>;Trusted_Connection=False;"

结果:运行时错误 ODBC -- 调用失败(错误 #3146)

-- 编辑于 08/08/2011 @ 16:41 --

连接字符串迭代的更多失败,我正式不知道如何使这个野兽工作。在尝试了以前的方法之后 - 现在在请求 DSN 后,使用该接口进行的任何传递都会失败。无法修复,必须恢复它们才能调用链接表并通过 JET 运行。

strConnect = "ODBC;DATA SOURCE=instkeeper_test;"

结果:运行时错误 ODBC -- 调用失败(错误 #3146)

strConnect = "ODBC;DRIVER=SQL Server;SERVER=ENV980-067\ENVIRON_TEST;"

结果:运行时错误 ODBC -- 调用失败(错误 #3146)

strConnect = "ODBC;DRIVER=SQL Server;Server=ENV980-067\ENVIRON_TEST;Database=instkeeper_test;User ID=<my user name>;Password=<my password>;"

结果:运行时错误 ODBC -- 调用失败(错误 #3146)

4

3 回答 3

1

在 SQL Server 端,可以

  1. 使用另一个DBCC命令

    DBCC CHECKIDENT ('MyTable', RESEED, 1)

  2. 或者使用TRUNCATE TABLE ...

如果表包含标识列,则该列的计数器将重置为为该列定义的种子值。如果没有定义种子,则使用默认值 1。

所以你会跑

TRUNCATE TABLE MyTable
于 2011-08-08T16:42:58.173 回答
0

我检查了所有代码,并咨询了当地的 VBA 专家,他指出我在尝试进行传递查询时在表命名时出错。基本上,我是通过它在我的前端作为链接拥有的名称来引用该表,而不是它在后端 SQL Server 中拥有的实际表名。

以下连接字符串在更正后起作用:

strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067\ENVIRON_TEST;DATABASE=instkeeper_test;TRUSTED_CONNECTION=YES;"

然后,这允许我对远程表执行 TRUNCATE TABLE 命令,并执行 DoCmd.RunSQL 语句以从生产源重新填充表。

最终结果是,选择选项以更新活动时,它将清除远程表的内容,然后在重置AutoNumber时将生产表的内容读取到测试表中。

于 2011-08-09T21:02:22.170 回答
0

我发现了一种简单的方法,即在 SQL 视图中使用 Access 编写的 SQL 查询!

请访问: http ://answers.microsoft.com/en-us/office/forum/office_2003-access/reset-autonumber-in-access-table-automatically/66cbcfed-5cbe-40f6-b939-9aea8bbea2de

写这个:

ALTER TABLE YourTable ALTER COLUMN YourField COUNTER(1,1)

于 2013-07-19T19:11:04.637 回答