Inserting data to other xls workbook via ADO & SQL – 数据类型错误
Inserting data to other xls workbook via ADO & SQL – Data type error
我正在构建一个非常复杂的用户窗体,它使用 ADO 连接连接到另一个用作数据库的 Excel 工作簿,并通过 SQL 查询检索和插入数据。请注意,在这种情况下,我不允许使用 Access。
我已经弄清楚如何使用 SELECT,但是我无法解决 INSERT 的一个特殊错误。这让我很困扰,我为此付出了很多努力。
首先是连接(我使用 JET 检索数据,使用 ACE 保存数据,因为我无法让 JET 工作):
Public Sub InsertDataToSheet(SQLCmd As String)
Dim cnx As Object
Set cnx = CreateObject("ADODB.Connection")
cnx.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" & ThisWorkbook.Path & "\Database.xls'; Extended Properties=Excel 12.0;"
cnx.Execute SQLCmd
cnx.Close
End Sub
然后有一个链接到实际生成查询的提交按钮的子例程,因为我只需要保存已填写的文本框和组合以避免空值:
Private Sub SaveRecord()
Dim SQL As String
SQL = "INSERT INTO [Report$A2:AM50000] ("
Dim i As Control
For Each i In Me.controls
If TypeName(i) = "TextBox" Or TypeName(i) = "ComboBox" Then
If i <> e Then SQL = SQL & i.Name & ","
End If
Next i
SQL = Mid(SQL, 1, Len(SQL) - 1) & ") VALUES(" ' Remove last space & comma
Dim j As Control
For Each j In Me.controls
If TypeName(j) = "TextBox" Or TypeName(j) = "ComboBox" Then
If j <> e Then
If j = "Unknown" Then MsgBox "Fire"
Select Case IsNumeric(j)
Case False
SQL = SQL & "'" & j & "'" ' Add single quotes around strings
Case True
SQL = SQL & j
End Select
SQL = SQL & ","
End If
End If
Next j
SQL = Mid(SQL, 1, Len(SQL) - 1) & ")" ' Remove last comma
' Connect
InsertDataToSheet (SQL)
End Sub
表单中有两个特定的文本框工作方式完全相同。通常,用户向他们输入数字,一切都会保存(不要介意“+”按钮):
然而,有时用户不知道这些值,但不能将它们留空。那时他们应该勾选复选框以将值设置为 'Unknown':
现在有趣的部分来了——对于 Batch 字段,它保存得很好。但是当我将 Shipment ID 设置为 'Unknown'(或任何其他字符串)时,它会抛出一个错误:
请注意,这些字段并未被禁用,只是经过一些外观更改而被锁定。我也找不到有关该错误的任何具体细节,但查询似乎存在一些问题:
(类似于 'Incompatible data types in the expression')。生成的查询是这样的:
知道哪里出了问题吗?我非常希望保留已知的功能并解决错误,而不是重新设计它,因为它已经花费了一些精力并且字段不能留空。
从未在 xls 工作簿中使用过 sql,但我已经在 SQL 服务器上遇到过这个问题。您的查询没有 "wrong",问题是您要插入的 table 字段接受的数据类型。尝试将该字段改为使用文本值而不是数字,它应该可以工作。
我正在构建一个非常复杂的用户窗体,它使用 ADO 连接连接到另一个用作数据库的 Excel 工作簿,并通过 SQL 查询检索和插入数据。请注意,在这种情况下,我不允许使用 Access。
我已经弄清楚如何使用 SELECT,但是我无法解决 INSERT 的一个特殊错误。这让我很困扰,我为此付出了很多努力。
首先是连接(我使用 JET 检索数据,使用 ACE 保存数据,因为我无法让 JET 工作):
Public Sub InsertDataToSheet(SQLCmd As String)
Dim cnx As Object
Set cnx = CreateObject("ADODB.Connection")
cnx.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" & ThisWorkbook.Path & "\Database.xls'; Extended Properties=Excel 12.0;"
cnx.Execute SQLCmd
cnx.Close
End Sub
然后有一个链接到实际生成查询的提交按钮的子例程,因为我只需要保存已填写的文本框和组合以避免空值:
Private Sub SaveRecord()
Dim SQL As String
SQL = "INSERT INTO [Report$A2:AM50000] ("
Dim i As Control
For Each i In Me.controls
If TypeName(i) = "TextBox" Or TypeName(i) = "ComboBox" Then
If i <> e Then SQL = SQL & i.Name & ","
End If
Next i
SQL = Mid(SQL, 1, Len(SQL) - 1) & ") VALUES(" ' Remove last space & comma
Dim j As Control
For Each j In Me.controls
If TypeName(j) = "TextBox" Or TypeName(j) = "ComboBox" Then
If j <> e Then
If j = "Unknown" Then MsgBox "Fire"
Select Case IsNumeric(j)
Case False
SQL = SQL & "'" & j & "'" ' Add single quotes around strings
Case True
SQL = SQL & j
End Select
SQL = SQL & ","
End If
End If
Next j
SQL = Mid(SQL, 1, Len(SQL) - 1) & ")" ' Remove last comma
' Connect
InsertDataToSheet (SQL)
End Sub
表单中有两个特定的文本框工作方式完全相同。通常,用户向他们输入数字,一切都会保存(不要介意“+”按钮):
然而,有时用户不知道这些值,但不能将它们留空。那时他们应该勾选复选框以将值设置为 'Unknown':
请注意,这些字段并未被禁用,只是经过一些外观更改而被锁定。我也找不到有关该错误的任何具体细节,但查询似乎存在一些问题:
(类似于 'Incompatible data types in the expression')。生成的查询是这样的:
知道哪里出了问题吗?我非常希望保留已知的功能并解决错误,而不是重新设计它,因为它已经花费了一些精力并且字段不能留空。
从未在 xls 工作簿中使用过 sql,但我已经在 SQL 服务器上遇到过这个问题。您的查询没有 "wrong",问题是您要插入的 table 字段接受的数据类型。尝试将该字段改为使用文本值而不是数字,它应该可以工作。