2009-12-29 19 views
3

我需要每天填寫數千個條目的數據庫,但是此時我的代碼手動將每個條目插入到數據庫中。Excel VBA,如何執行多個數據庫條目

Do While lngSQLLoop < lngCurrentRecord 
    lngSQLLoop = lngSQLLoop + 1 
    sql = "INSERT INTO db (key1, key2) VALUES ('value1', 'value2');" 
    result = bInsertIntoDatabase(sql, True) 
    If result = false Then lngFailed = lngFailed + 1 
Loop 

這可行,但每100個條目大約需要5秒。會不會有更有效的方法將其放入數據庫?我試過

INSERT INTO db(key1,key2)VALUES('value1-1','value2-1'),('value1-2','value2-2'),('value1-3 ','value2-3');

但這失敗了一個遺漏冒號;錯誤,暗示它不喜歡這樣列出的值。有沒有辦法讓VBA做到這一點?

+1

哪個數據庫? – Fionnuala 2010-01-01 14:24:53

回答

4

使用多隻(),()條款可與SQL Server 2008中

不過你很幸運:你可以批量這些通過簡單地串聯SQL語句和批來電來bInsertIntoDatabase。

這種方法唯一的缺點是,如果批處理中的一條語句失敗,批處理中的每個後續語句也會失敗。因此,如果失敗是一個常見問題(比如說,來自關鍵衝突),則需要使用其他方法。一種解決方案是:

  • 插入批次到臨時表的第一(無唯一索引,從而避免故障最初)
  • 做一個最終插入與主表WHERE子句,防止錯誤
  • 獲取結果計數並從臨時表中的記錄總數中減去以獲取失敗次數。
+1

+1,完美無缺。但是不要犯我曾經犯過的錯誤:'sql = sql +「INSERT ...;」'在一個循環中。字符串串聯非常緩慢,因爲字符串增長(http://support.microsoft.com/kb/170964)。用一個預先分配的緩衝區寫一個你自己的小緩衝區或谷歌的vba字符串類。 – stephan 2009-12-29 16:28:07

+0

@stephanL好點,使用字符串數組並與JOIN()連接是一箇舊的VBA技巧,用於字符串連接的性能。 – richardtallent 2009-12-29 16:32:03

0

如果您的數據源可以通過數據庫驅動程序(如ODBC)來訪問和數據庫框架支持異類查詢,你應該能夠做到:

INSERT INTO targetDBtable (key1, key2) 
VALUES (SELECT key1, key2 FROM sourceDBtable); 
0

使用.AddNew和.Update使用可更新的記錄集看起來很快:在我的系統上大約需要0.25秒來添加10000條沒有錯誤的記錄,或者1.25秒來添加10000條有10000條錯誤的記錄。

0

首先將數據保存到CSV文件,然後使用Access的TransferText方法(DoCmd對象的)一次性加載到Access表。請記住隨後刪除CSV文件。

即使您從Excel運行代碼,仍然可以通過自動化在Access中執行TransferText方法。