Excel 工作表通过 ADODB 不一致的行为导出到 Access

Posted

技术标签:

【中文标题】Excel 工作表通过 ADODB 不一致的行为导出到 Access【英文标题】:Excel sheet export to Access via ADODB inconsistent behavior 【发布时间】:2015-11-05 20:44:51 【问题描述】:

当我通过 ADODB 将 Excel 电子表格导出到 Access 数据库时,我遇到了一种奇怪的行为。 Office 版本是 2013 32 位,在 Win7 64 位上运行。步骤如下:

    我创建了一个名为“test.accdb”的新 Access 文件,其中只有一个表“orders”和一个字段“OrderID强>'。该表是空的。

    我创建了一个新的 .csv 文件 orders.csv。稍后我会展示这个文件的内容和最终结果。

    我有一个带有以下宏的 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
    

    然后我使用 Excel 打开 order.csv 文件,运行宏,然后使用 Access 打开 test.accdb。根据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 失败了?

我无法绕过它。我尝试了两个驱动程序,但没有成功。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Excel 工作表通过 ADODB 不一致的行为导出到 Access的主要内容,如果未能解决你的问题,请参考以下文章

ADODB对象忽略excel中的文本

从ADODB记录集复制数据时,Excel表丢失数字格式

将数据插入表时出现 ADODB VBA 自动化错误

ADODB 记录集不会在 MS SQL 的临时表中添加新记录

SQL 运行时错误的 Excel ADODB 连接

尝试通过 ADODB/SQLiteODBC 更改 SQLite 数据库的日志模式时,Excel/VBA 挂起