Excel sheet 通过 ADODB 导出到 Access 的行为不一致

Excel sheet export to Access via ADODB inconsistent behavior

当我通过 ADODB 将 Excel 电子表格导出到 Access 数据库时,我遇到了一个奇怪的行为。 Office版本是2013 32bit 运行ning on Win7 64bit。这些是步骤:

  1. 我创建了一个名为“test.accdb”的新 Access 文件,其中只有一个 table“订单' 和一个字段 'OrderID'。 table 为空。

  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, 在 table 'orders':

OrderID
1
A

案例 B

orders.csv:

OrderID
1
A
3

test.accdb,在table 'orders'

OrderID
<blank>
1
3

案例 C

orders.csv:

OrderID
1
A
3
B
C
D

test.accdb,在table 'orders'

OrderID
1
3
A
B
C
D

为什么案例 B 失败了?

我无法理解它。我尝试了两个驱动程序,但都不成功。

带有 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)
...