2011-08-08 40 views
0

我想保留一個活動表的副本在SQL Server Express表和生產Access版本之間同步。在其他表中,我能夠擦除SQL Server表的內容,並將整個混亂插入以捕獲所有更改。然而,當我試圖用這張表做這件事時 - 我得到了信息 - 但自動編號字段從上一次迭代中最後一個未使用的數字開始遞增。經過十幾次'同步'操作後,我很危險地接近用完該領域的自動編號。訪問和SQL服務器:使用表擦除重置自動編號字段

我試圖從Microsoft訪問前端應用,它拋出一個錯誤,該聲明並沒有用SELECT開始,DELETE,程序,DROP,ALTER或類似的東西發出「DBCC CHECKIDENT」。這個命令在從SQL Server管理控制檯(我在當前測試環境中有權訪問的工具,但在應用程序進入生產時不能訪問)發佈時可以工作。

然後,我使用DoCmd.RunSQL命令嘗試'TRUNCATE TABLE'查詢,並且拋出了鏈接表(大約)不支持該操作的錯誤。此錶鏈接到Microsoft Access前端(後端表位於SQL Server Express上)。

所以,對於一個快速摘要:

  • 前端是一個的Microsoft Access VBA應用
  • 數據存儲在SQL Server Express的遠程計算機
  • 數據表在前端連接上應用程序
  • 當此應用程序進行生產時,我將無法使用SQL Server Management Console命令,因此需要自行運行它。
  • 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)

+0

1.整理我們的問題了所以它不是不是一個長段落2.添加你所嘗試過的東西(例如,你在評論中提到了CHECKIDENT,但是在問題中提到了nit並且降低了我的評分)3.根據評論,告訴我們你想如何運行它:不是「它不起作用「 – gbn

+0

你的權利 - 我編輯它來反映這一點。 –

回答

0

我經歷了所有我的代碼去,並與當地的VBA專家誰指出,我在我的表的命名作出了錯誤檢查嘗試做一個傳遞查詢。基本上,我是通過它在前端中作爲鏈接擁有的名稱來引用表,而不是它在後端SQL Server中擁有的實際表名。

下面的連接字符串,一旦這已得到糾正,工作:

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

那麼,這讓我在遠程表上執行truncate table命令,並執行DoCmd.RunSQL語句來重新填充表來自生產源。

最終結果是,當選擇該選項更新活動時,它將清除遠程表的內容,然後將生產表的內容讀入測試表中以供重置自動編號時使用。

1

在SQL Server端,可以

  1. 使用另一個DBCC命令

    DBCC CHECKIDENT ('MyTable', RESEED, 1)

  2. 或者使用TRUNCATE TABLE ...

如果表包含標識列,該列的計數器重置爲爲列定義的種子值。如果未定義種子,則使用默認值1。

所以,你會運行

TRUNCATE TABLE MyTable 
+0

DBCC命令不起作用,因爲我也嘗試了checkident命令。在此上下文中不能發佈TRUNCATE,因爲當以編程方式完成此操作時,會出現「無效的SQL語句(錯誤#3129)」。這些選項都不起作用,對不起。 –

+0

我知道他們的工作......所以你*做錯了什麼?驗證他們在SQL Server工具中工作,然後找出爲什麼不在Access中。並整理你的問題,以便更易讀... – gbn

+1

@Comrad_Durandal:更多:這些是SQL服務命令,而不是Jet命令。我不在乎Jet說什麼。它們應該在服務器上運行或作爲傳遞查詢:不針對鏈接的表。 – gbn