VBA中的strSQL结果(Access 2003)

时间:2011-11-09 00:56:35

标签: sql vba ms-access-2003

我正在制作一个表格,将一些记录添加到我的数据库和我有些问题。如果用户填写了名为“产品”的字段,我想通过显示该产品在数据库中的可见图片来通知他。 (我只是想告诉他 - 不要禁止添加选项)

我有这个代码,不幸的是它给了我一个错误(运行时错误没有运算符)

Private Sub ProductText_LostFocus()
Dim cnn as New ADODB.Connection
Dim strSQL as String
Dim rs as New ADODB.Recordset
Set cnn = CurrentProject.Connection
strSQL = "Select Product FROM Shopping WHERE Product = " & ProductText.Value
Set rs = cnn.Execute(strSQL)
If rs.RecordCount > 0 then
ShowPicture.Visible = True
End if
End sub

我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果您使用带有强类型Command对象的Parameter对象,则无需担心在参数值中包含或转义引号,另外还可以免受SQL injection的豁免

这里我简化了您的代码并假设您的Product列为NVARCHAR(255),即可变宽度Unicode(无压缩)文本:

Private Sub ProductText_LostFocus()
  Dim cmd As New ADODB.Command
  With cmd
    Set .ActiveConnection = CurrentProject.Connection
    .CommandText = "Select Product FROM Shopping WHERE Product = ?;"
    .CommandType = adCmdText
    .Parameters.Append .CreateParameter(, adVarWChar, , 255, ProductText.Value)
    If Not .Execute().EOF Then
      ShowPicture.Visible = True
    End If
  End With
End Sub

答案 1 :(得分:0)

你有几个不同的问题。

首先,不要创建cnn和rs的新实例,因为它们将在以后设置或创建:

Dim cnn as ADODB.Connection
Dim strSQL as String
Dim rs as ADODB.Recordset

其次,您需要将产品括在SQL中的引号中(如果producttext包含单引号,您可能需要执行其他工作):

strSQL = "Select Product FROM Shopping WHERE Product = '" & ProductText.Value & "'"