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的主要内容,如果未能解决你的问题,请参考以下文章