如何编写使用数字作为参数和数字类型字段的查询?

时间:2019-12-30 19:50:13

标签: sql vba ms-access

我需要启动查询以使用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”类型不匹配。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

多个问题

    WHERE子句中的
  1. 类型不匹配: 您的查询(即WHERE子句)尝试将数据库中的数字列与字符串值(例如WHERE numberField = '123')进行比较。这将导致运行时错误Type mismatch (Error 13)。另请参见similar question

  2. 使用+ 连接字符串不安全 构建查询时,您尝试通过加号将查询模板与数字参数连接起来。仅在对数字进行运算时有效。参见related question

解决方案

  1. 删除单引号:您应该将数字列NMT与数字文字(例如WHERE nmt = 123)进行比较
  2. 使用&连接字符串。这还将数字转换为字符串。此外,我在下面明确使用了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中。

最好使用预定义/准备参数化查询:

另请参见