Excel sheet 通过 ADODB 导出到 Access 的行为不一致
Excel sheet export to Access via ADODB inconsistent behavior
当我通过 ADODB 将 Excel 电子表格导出到 Access 数据库时,我遇到了一个奇怪的行为。 Office版本是2013 32bit 运行ning on Win7 64bit。这些是步骤:
我创建了一个名为“test.accdb”的新 Access 文件,其中只有一个 table“订单' 和一个字段 'OrderID'。 table 为空。
我创建了一个新的 .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 文件,然后打开 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)
...
当我通过 ADODB 将 Excel 电子表格导出到 Access 数据库时,我遇到了一个奇怪的行为。 Office版本是2013 32bit 运行ning on Win7 64bit。这些是步骤:
我创建了一个名为“test.accdb”的新 Access 文件,其中只有一个 table“订单' 和一个字段 'OrderID'。 table 为空。
我创建了一个新的 .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 文件,然后打开 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)
...