我需要启动查询以使用VBA从Access数据库检索数据,我想使用变量号作为参数。有可能吗?
类似于:
field name: NMT field type (number)
table name: Orders
,代码如下:
Dim Con As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim X as Integer
X = me.textbox1.value
Con.Open "Provider= Microsoft.ACE.OLEDB.12.0;Data Source=" & U.Database01 & "\DB.accdb;Persist Security Info=False"
Rs.Open "select * from Orders where nmt = '" + X + "'", Con, adOpenDynamic, adLockPessimistic
每当我运行此查询时,都会出现运行时错误“ 13”类型不匹配。
有什么建议吗?
答案 0 :(得分:1)
类型不匹配:
您的查询(即WHERE子句)尝试将数据库中的数字列与字符串值(例如WHERE numberField = '123'
)进行比较。这将导致运行时错误Type mismatch (Error 13)。另请参见similar question。
使用+
连接字符串不安全
构建查询时,您尝试通过加号将查询模板与数字参数连接起来。仅在对数字进行运算时有效。参见related question
NMT
与数字文字(例如WHERE nmt = 123
)进行比较&
连接字符串。这还将数字转换为字符串。此外,我在下面明确使用了CStr
函数。Dim Con As New ADODB.Connection
Dim RS As New ADODB.Recordset
Dim strSQL As String
Dim nmtNumber as Integer ' you named it x before
nmtNumber = me.textbox1.value
strSQL = "SELECT * FROM Orders WHERE nmt = " & CStr(nmtNumber) ' removed single-quotes and used ampersand to concatenate with converted string
Con.Open "Provider= Microsoft.ACE.OLEDB.12.0;Data Source=" & U.Database01 & "\DB.accdb;Persist Security Info=False"
RS.Open strSQL, Con, adOpenDynamic, adLockPessimistic
我已经将SQL字符串(建筑物)提取到上面的单独变量strSQL
中。
最好使用预定义/准备和参数化查询:
QueryDef
(DAO),您可以在其中设置参数(类型安全)。参见this question。Command
(ADODB),您可以在其中设置参数(类型安全)。参见this question。