Excel工作表通过ADODB不一致的行为导出到Access
当我通过ADODB将Excel电子表格导出到Access数据库时,我遇到了一个奇怪的行为。 Office版本是在Win7 64bit上运行的2013 32bit。 这些步骤是:
-
我创build了一个名为' test.accdb '的新Access文件,只有一个' orders '表和一个' OrderID '字段。 桌子是空的。
-
我创build了一个新的.csv文件orders.csv 。 稍后我会显示这个文件的内容和最终结果。
-
我有一个Excel插件与下面的macros:
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文件,运行macros,然后使用Access打开test.accdb 。 根据csv文件的内容,输出不同的结果:
案例A
orders.csv:
OrderID 1 A
test.accdb,在'订单'表中:
OrderID 1 A
案例B
orders.csv:
OrderID 1 A 3
test.accdb,在'orders'表中
OrderID <blank> 1 3
案例C
orders.csv:
OrderID 1 A 3 B C D
test.accdb,在'orders'表中
OrderID 1 3 A B C D
为什么情况B失败?
我无法把头围住。 我试了两个司机,但没有运气。
带有Excel数据库的ADODB将从前16个logging中猜测字段types。 在这种情况下
OrderID 1 A 3
它会猜测数字字段types,因为数字是多数。
为了避免这种情况,您可以使用连接string中的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) ...