我试图保持SQL Server Express表和生产访问版本之间同步的活动表的副本。在其他表中,我能够擦除SQL Server表的内容,并将整个混乱插入其中以捕获所有更改。但是,当我尝试对这个表执行此操作时——我获得了信息——但是Autonumber字段从上次迭代中最后一个未使用的数字开始递增。在进行了十几次"同步"操作后,这个字段的自动编号已经快用完了。
我试过从Microsoft Access前端应用程序发出'DBCC CHECKIDENT',这会抛出一个错误,该语句没有以SELECT, DELETE, PROCEDURE, DROP, ALTER或类似的东西开始。当从SQL Server管理控制台发出此命令时,此命令确实工作(我在当前测试环境中可以访问的工具,但当应用程序进入生产时将不工作)。
然后我尝试使用DoCmd查询'TRUNCATE TABLE'。运行sql命令,它抛出了错误,该操作不支持链接表(大约)。这个表链接到Microsoft Access前端(后端表在SQL Server Express上)。
快速总结一下:
- 前端是一个Microsoft Access VBA应用程序
- 数据存储在远程机器上的SQL Server Express上
- 数据表在前端应用程序中链接
- 当这个应用程序进入生产时,我将无法使用SQL Server管理控制台命令,它需要自己运行它的管家。
- DoCmd。RunSQL和CurrentDB。Execute似乎不允许使用TRUNCATE TABLE -或- 'DBCC CHECKIDENT'命令。
- 当从SQL Server管理控制台发出时,上述两个功能- do -工作-参见上面为什么这不是一个可行的选择。
- -所有-其他表的行为方式我希望他们除了这一个,重置他们的身份字段适当。
—编辑于2011年8月8日@ 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-067ENVIRON_TEST;DATABASE=instkeeper_test;Uid=<my username>;Pwd=<my password>;"
结果:运行时错误ODBC——call failed (error #3146)
strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067ENVIRON_TEST;DATABASE=instkeeper_test;TRUSTED_CONNECTION=YES;"
结果:运行时错误ODBC——call failed (error #3146)
strConnect = "ODBC;DSN=instkeeper_beta;"
结果:询问我数据源名称,一旦使用数据源管理面板指定,我得到运行时错误ODBC——调用失败(错误#3146)
strConnect = "ODBC;Server=ENV980-067ENVIRON_TEST;Database=instkeeper_test;User ID=<my user name>;Password=<my password>;Trusted_Connection=False;"
结果:运行时错误ODBC——call failed (error #3146)
——编辑于2011年8月8日16:41——
在连接字符串的迭代上更多的失败,我正式没有关于如何使这个野兽工作的想法。在尝试了之前的-现在任何通过接口在请求DSN后都失败了。无法修复,必须恢复它们以调用链接表并通过JET运行。
strConnect = "ODBC;DATA SOURCE=instkeeper_test;"
结果:运行时错误ODBC——call failed (error #3146)
strConnect = "ODBC;DRIVER=SQL Server;SERVER=ENV980-067ENVIRON_TEST;"
结果:运行时错误ODBC——call failed (error #3146)
strConnect = "ODBC;DRIVER=SQL Server;Server=ENV980-067ENVIRON_TEST;Database=instkeeper_test;User ID=<my user name>;Password=<my password>;"
结果:运行时错误ODBC——call failed (error #3146)
在SQL Server端,您可以
-
使用另一个DBCC命令
DBCC CHECKIDENT ('MyTable', RESEED, 1)
如果表包含标识列,则该列的计数器将重置为为该列定义的种子值。如果没有定义种子,则使用默认值1。
所以你会运行
TRUNCATE TABLE MyTable
我检查了所有的代码,并与当地的VBA专家进行了检查,他指出我在尝试进行传递查询时在表的命名中犯了一个错误。基本上,我是通过它在我的前端作为链接所拥有的名称来引用表,而不是它在后端在SQL Server中所拥有的实际表名。
下面的连接字符串,一旦这个被纠正,工作:
strConnect = "ODBC;DRIVER={SQL Server};SERVER=ENV980-067ENVIRON_TEST;DATABASE=instkeeper_test;TRUSTED_CONNECTION=YES;"
这允许我在远程表上执行TRUNCATE TABLE命令,并执行DoCmd。运行sql语句从生产源重新填充表。
最终结果是,当选择更新Activity的选项时,它将清除远程表的内容,然后将生产表的内容读取到测试表中以供使用,同时重置自动编号。
我发现了一种简单的方法,通过在Access中编写SQL查询,在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)