【问题标题】:Using a variable in where clause在 where 子句中使用变量
【发布时间】:2016-05-18 08:28:45
【问题描述】:

使用以下代码:

Dim RCMSql As String
    RCMSql = "SELECT [Range Card Master Mailer].Master_ID," & _
    "[Range Card Master Mailer].MaxOfDate_of_Transaction," & _
    "[Range Card Master Mailer].FirstName," & _
    "[Range Card Master Mailer].LastName," & _
    "[Range Card Master Mailer].Email_Address," & _
    "[Range Card Master Mailer].Address_Line_1," & _
    "[Range Card Master Mailer].Phone_Number_1," & _
    "[Range Card Master Mailer].Phone_Number_2," & _
    "[Range Card Master Mailer].Date_Sent," & _
    "[Range Card Master Mailer].RedeemFlag " & _
    "FROM [Range Card Master Mailer] " & _
    "WHERE ((([Range Card Master Mailer].Master_ID) = '002366'))"
     RCMRs.Open RCMSql  

这执行得很好,但是如果我将 where 子句更改为使用打开表单上的文本框中的值,我会收到错误“没有为一个或多个参数提供值”

"WHERE ((([Range Card Master Mailer].Master_ID) = Me!scanTxtBox))"

我已经尝试了至少十几种变体,但都无法使用

谢谢

jpl

【问题讨论】:

  • 能否为您正在使用的数据库(Access、MySQL、MS SQL 等)添加适用的标签?
  • Access 7、Office 7、SQL 服务器

标签: sql-server ms-access vba ms-access-2007 ms-office


【解决方案1】:

我相信这就是您正在寻找的:

Dim RCMRs As ADODB.Recordset
Dim RCMSql As String
RCMSql = "SELECT [Range Card Master Mailer].Master_ID," & _
    "[Range Card Master Mailer].MaxOfDate_of_Transaction," & _
    "[Range Card Master Mailer].FirstName," & _
    "[Range Card Master Mailer].LastName," & _
    "[Range Card Master Mailer].Email_Address," & _
    "[Range Card Master Mailer].Address_Line_1," & _
    "[Range Card Master Mailer].Phone_Number_1," & _
    "[Range Card Master Mailer].Phone_Number_2," & _
    "[Range Card Master Mailer].Date_Sent," & _
    "[Range Card Master Mailer].RedeemFlag " & _
    "FROM [Range Card Master Mailer] " & _
    "WHERE ((([Range Card Master Mailer].Master_ID) = '" & _
    Replace(Me!scanTxtBox, "'", "''") & "'))"
RCMRs.Open RCMSql

【讨论】:

  • 如果无法使用参数化查询,至少将 TextBox 内容转换为 int,以避免 SQL 注入
  • 谢谢拉尔夫。阅读替换功能。
  • scanTxtBox 中的值很可能包含前导零。所以转换为整数是行不通的。该值的长度必须为 6 个字符。
  • 据我所知,我的答案并没有尝试转换为 int。那么,提供的解决方案是否有效?如果是这样,请关闭问题。如果没有,请让我知道什么不起作用或发生错误的地方。
【解决方案2】:

在你的代码中定义一个局部变量为字符串

如果您发布的第一个代码运行,Master_ID 被定义为字符串,因此,使用

定义一个局部变量
Dim localScanTxtBox as string

并将其设置为(如果您的 scanTxtBox 中有一个 6 字符的字符串):

localScanTxtBox = Me!scanTxtBox

或者,将其转换为 6 位字符串:

localScanTxtBox = format$(Me!scanTxtBox,"000000")

然后将您的where statement 写为:

WHERE ((([Range Card Master Mailer].Master_ID) = '" & localscanTxtBox & "'))

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多