2011-08-08 59 views
2

我正在將一組MS Access後端數據庫升遷爲SQL Server。我編寫了SQL腳本來在SQL Server中創建表格模式。現在我正試圖填充表格。大多數表具有自動編號的主鍵。這是我的一般方法:強制SET SET IDENTITY_INSERT從MS Access更快地生效

For each TblName in LinkedTableNames 
    'Create linked table "temp_From" that links to the existing mdb' 
    'Create linked table "temp_To" that links to the new SQL server table 
    ExecutePassThru "SET IDENTITY_INSERT " & TblName & " ON" 
    db.Execute "INSERT INTO temp_To SELECT * FROM temp_From", dbFailOnError 
    ExecutePassThru "SET IDENTITY_INSERT " & TblName & " OFF" 
Next TblName 

第一次插入立即發生。隨後的插入嘗試失敗,並顯示以下錯誤:「IDENTITY_INSERT設置爲OFF時,無法在表'TblName'中插入標識列的顯式值。」

我添加了一個Resume語句爲那個特定的錯誤和一個計時器。事實證明,錯誤持續600秒(十分鐘),然後插入成功。

MS Access會每隔10分鐘自動刷新其ODBC會話嗎?有沒有辦法強制這種情況發生得更快?我是否缺少明顯的東西?

這些背景信息誰就會立刻想說「使用升遷嚮導」:我不使用
內置的升遷是因爲我需要能夠從腳本啓動整個操作完。目標是在執行客戶端位置的交換機之前使其在測試環境中運行。

回答

2

我找到了第一個問題的答案。十分鐘是埋在註冊表中的Jet引擎項下的設置:

'Jet WinXP/ Win7 32-bit:' 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\ODBC\ConnectionTimeout 

'Jet Win7 64-bit:' 
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\ODBC\ConnectionTimeout 

'ACE WinXP/ Win7 32-bit:' 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Access Connectivity Engine\Engines\ODBC\ConnectionTimeout 

'ACE Win7 64-bit:' 
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MicrosoftAccess Connectivity Engine\Engines\ODBC\ConnectionTimeout 

這是documented here的ACE:

ConnectionTimeout: The number of seconds a cached connection can remain idle before timing out. The default is 600 (values are of type REG_DWORD).

這個鍵被設定爲600默認這是600秒10分鐘。我減少了10秒,代碼相應地加快了。

這絕不是完整的解決方案,因爲將默認值設置爲低會導致其他地方出現問題。實際上,Tony Toews once recommended,使用無DSN連接時默認情況下最好是增加

我仍然希望找到答案,我的問題的第二部分,即是否有辦法強制刷新更快地發生。

1

兩個想法,但不知道是否會有用,因爲這是我不熟悉的領土。

不MS Access自動刷新其ODBC會議每10分鐘?有沒有辦法迫使這種情況發生得更快?我失去了一些東西明顯?

在Access 2003中選項對話框,在高級選項卡中,有一個「ODBC刷新間隔」設置以及重試設置。調整這些幫助是否......或者有任何影響?

我想知道是否可以通過創建SQL Server列作爲普通數字而不是自動編號,插入數據,然後ALTER TABLE ... ALTER COLUMN在數據插入後更改它們來避免此問題。

如果表中包含數據,Access將不允許我將數字列轉換爲自動編號,但ISTR SQL Server在該分數上更靈活。

+0

+1好主意。我沒有嘗試第一個建議,因爲我找到了我在埋入註冊表後的設置(我將添加它作爲單獨的答案)。第二種方法直接使用SQL Server Mgmt Studio,但隱藏了所需的內在低效率。它實際上涉及將所有記錄複製到臨時表(使用SET IDENTITY_INSERT ON/OFF),刪除原始表並將臨時表重命名爲原始表。我的一張桌子上有200萬條記錄,所以我想避免這種低效率。 – mwolfe02