访问& SQL-Server:使用表擦除重置自动编号字段

时间:2011-08-08 16:40:03

标签: ms-access sql-server-express autonumber

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

我尝试从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”命令。
  • 上述两个函数-DO-在从SQL Server管理控制台发出时都起作用 - 请参阅上文,了解为什么这不是一个可行的选项。
  • -ALL-除了这个之外,其他表的行为与我期望的一样,在适当的时候重置它们的缩进字段。

- 编辑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)

3 个答案:

答案 0 :(得分:1)

在SQL Server端,您可以

  1. 使用其他DBCC命令

    DBCC CHECKIDENT ('MyTable', RESEED, 1)

  2. 或使用TRUNCATE TABLE ...

  3.   

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

    所以你要跑

    TRUNCATE TABLE MyTable
    

答案 1 :(得分:0)

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

以下连接字符串一旦更正,就可以工作:

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

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

最终结果是,当选择该选项来更新Activity时,它将清除远程表的内容,然后将生产表的内容读入测试表,以便在重置自动编号时使用。

答案 2 :(得分:0)

我发现了一种简单的方法,可以在SQL View中编写一个用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)