2015-11-05 98 views
0

當我通過ADODB將Excel電子表格導出到Access數據庫時,我遇到了一個奇怪的行爲。 Office版本是在Win7 64bit上運行的2013 32bit。這些步驟如下:Excel工作表通過ADODB不一致行爲導出到Access

  1. 我創建了一個叫做「test.accdb」新的Access文件,只是一個表「訂單」和一個字段「的OrderID」。該表是空的。

  2. 我創建了一個新的.csv文件,orders.csv。稍後我會展示這個文件的內容和最終結果。

  3. 我有一個Excel加載項與下面的宏:

    Public Sub updateAccess() 
    
    Dim con As New ADODB.Connection 
    Dim connectionString As String 
    Dim rs As New ADODB.Recordset 
    Dim sql As String 
    Dim Filename As String 
    
    Filename = Application.ActiveWorkbook.Path & "\test.accdb" 
    
    connectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" & Filename 
    connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Filename 
    
    Call con.Open(connectionString) 
    
    sql = "DELETE FROM orders" 
    Call con.Execute(sql) 
    
    sql = "INSERT INTO orders " & _ 
         "SELECT * FROM [Excel 12.0 Xml;HDR=YES;DATABASE=" & _ 
         ActiveWorkbook.FullName & "].[" & ActiveWorkbook.Sheets(1).Name & "$]" 
    Set rs = con.Execute(sql) 
    
    Call con.Close 
    Set con = Nothing 
    
    End Sub 
    
  4. 然後我打開使用Excel中order.csv文件,運行宏,然後打開test.accdb使用Access。根據CSV文件的內容,不同的結果是輸出:

情況A

orders.csv:

OrderID 
1 
A 

test.accdb,表 '訂單':

OrderID 
1 
A 

案例B

orders.csv:

OrderID 
1 
A 
3 

test.accdb,表 '訂單'

OrderID 
<blank> 
1 
3 

案例C

orders.csv:

OrderID 
1 
A 
3 
B 
C 
D 

test.accdb,表 '訂單'

OrderID 
1 
3 
A 
B 
C 
D 

爲什麼情況B失敗?

我無法將頭圍住它。我試了兩個司機,但沒有運氣。

回答

3

帶Excel數據庫的ADODB將猜測前16條記錄中的字段類型。在這種情況下,

OrderID 
1 
A 
3 

它會猜測數字字段類型,因爲數字是多數。

爲了避免這種情況,可以使用連接字符串中IMEX參數,請參閱:https://www.connectionstrings.com/excel/

所以你的代碼:

... 
sql = "INSERT INTO orders " & _ 
     "SELECT * FROM [Excel 12.0 Xml;HDR=YES;IMEX=1;DATABASE=" & _ 
     ActiveWorkbook.FullName & "].[" & ActiveWorkbook.Sheets(1).Name & "$]" 
Set rs = con.Execute(sql) 
...