Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何构建正确的Access SQL类运算符表达式?_Sql_Ms Access - Fatal编程技术网

如何构建正确的Access SQL类运算符表达式?

如何构建正确的Access SQL类运算符表达式?,sql,ms-access,Sql,Ms Access,我正试图让用户在Microsoft Access 2010中通过表进行搜索,但SQL命令不起作用。加载和刷新表格的命令如下: SELECT Equipment.equipmentID, Equipment.equipmentName, Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment ORDER BY Equipment.equipmentName; 这是可行的,但当我尝试使用变量(或任何

我正试图让用户在Microsoft Access 2010中通过表进行搜索,但SQL命令不起作用。加载和刷新表格的命令如下:

SELECT Equipment.equipmentID, Equipment.equipmentName, Equipment.model, 
Equipment.make, Equipment.equipmentLocation FROM Equipment ORDER BY Equipment.equipmentName; 
这是可行的,但当我尝试使用变量(或任何正常条件)时:

我也尝试了类似“%10%”的方法来代替searchItem变量,但该命令使表变为空白,没有错误。我怀疑问题出在设备上。eqiupmentName作为列名,但我不太清楚这里出了什么问题

下面让我们快速查看一下该表的外观:


我怀疑您在SQL字符串中没有正确设置searchItem变量。我不太熟悉access字符串连接,但尝试将searchItem从SQL字符串中分离出来,然后检查RowSource是否具有您怀疑的值

Me.List64.RowSource = "SELECT Equipment.equipmentID, Equipment.equipmentName,
Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment 
WHERE Equipment.equipmentName LIKE '%" + searchItem + "%' ORDER BY Equipment.equipmentName;"

我怀疑您在SQL字符串中没有正确设置searchItem变量。我不太熟悉access字符串连接,但尝试将searchItem从SQL字符串中分离出来,然后检查RowSource是否具有您怀疑的值

Me.List64.RowSource = "SELECT Equipment.equipmentID, Equipment.equipmentName,
Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment 
WHERE Equipment.equipmentName LIKE '%" + searchItem + "%' ORDER BY Equipment.equipmentName;"
试试这个:

Me.List64.RowSource = & _
    "SELECT Equipment.equipmentID, Equipment.equipmentName," & _
        " Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
    " WHERE Equipment.equipmentName LIKE '*" & searchItem & "*'" & _
    " ORDER BY Equipment.equipmentName;"
  • 用户rjt011000有一个有效的解决方案,但我建议在VBA(和Access)中使用
    &
    进行字符串连接。有关+和&的说明,请参阅

  • Access不会识别或替换SQL语句中的VBA变量。此外,在这种情况下,LIKE运算符被提供一个SQL字符串值(在单引号内…在双引号内),因此即使VBA变量可以直接在SQL内引用,Access也不会解释字符串值内的任何此类内容

  • 关于Access SQL
    LIKE
    运算符,多字符匹配模式是
    *
    而不是
    %
    。Access还可以识别操作员
    的相似性
    ,这确实符合ANSI模式
    %
    。见和

    • 为了更彻底,如果您不希望用户无意中注入导致SQL错误的无效字符,则应转义字符串分隔符和类似模式匹配字符。下面是一个逃离其中几个的例子。对于所有特殊字符,都有更优雅的处理方法,但代码和技术超出了本答案的范围
  • 对于记录,尽管Access SQL不会替换VBA变量,但它将识别并调用公共VBA函数。通常,此类公共函数必须在普通模块中定义,但在表单的记录源查询上下文中,有时可以调用表单模块方法

  • 最后一项技术。。。可以在SQL中直接引用表单控件的值。这可以非常方便并减少额外的代码,但有几个注意事项:

    • 表单当然必须是打开的,否则Access会将引用解释为未知参数并显示提示。如果SQL总是在同一表单的上下文中,这当然不是问题
    • 当这样一个引用的控件被更改时,Access有时会自动刷新查询,但并不总是保证。自动刷新的“计时”可能不是直观的。您可以从各种表单事件中调用控件或子表单上的
      Refresh
      方法,以在值更改后强制查询刷新
    • 请注意,在下面的示例中,字符串连接在VBA字符串中,因此连接实际上发生在SQL上下文中,而不像第一个代码段中那样预先发生。这没有问题,只是考虑一下,因为整个答案围绕着正确的字符串解释和连接。
      • 但实际上,用户文本中未转义的模式匹配字符也存在同样的问题。与其通过调用Replace()使SQL文本变长、变丑,不如创建一个自定义函数(例如,
        EscapePattern()
        ),对任何文本执行此操作,然后用该函数包装控件引用。这个例子就是这样做的,尽管我没有包含特殊函数的代码。这样的函数也可以在第一个VBA代码段中使用,以简化SQL文本的构建
  • 总是有更多!您在我的示例中看到VBA行的延续了吗?它使SQL文本更容易在VBA编辑器中查看
试试这个:

Me.List64.RowSource = & _
    "SELECT Equipment.equipmentID, Equipment.equipmentName," & _
        " Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
    " WHERE Equipment.equipmentName LIKE '*" & searchItem & "*'" & _
    " ORDER BY Equipment.equipmentName;"
  • 用户rjt011000有一个有效的解决方案,但我建议在VBA(和Access)中使用
    &
    进行字符串连接。有关+和&的说明,请参阅

  • Access不会识别或替换SQL语句中的VBA变量。此外,在这种情况下,LIKE运算符被提供一个SQL字符串值(在单引号内…在双引号内),因此即使VBA变量可以直接在SQL内引用,Access也不会解释字符串值内的任何此类内容

  • 关于Access SQL
    LIKE
    运算符,多字符匹配模式是
    *
    而不是
    %
    。Access还可以识别操作员
    的相似性
    ,这确实符合ANSI模式
    %
    。见和

    • 为了更彻底,如果您不希望用户无意中注入导致SQL错误的无效字符,则应转义字符串分隔符和类似模式匹配字符。下面是一个逃离其中几个的例子。对于所有特殊字符,都有更优雅的处理方法,但代码和技术超出了本答案的范围
  • 对于记录,尽管Access SQL不会替换VBA变量,但它将识别并调用公共VBA函数。通常,此类公共功能必须在正常的
    Me.List64.RowSource = & _
      "SELECT Equipment.equipmentID, Equipment.equipmentName," & _
          " Equipment.model, Equipment.make, Equipment.equipmentLocation FROM Equipment" & _
      " WHERE Equipment.equipmentName LIKE ('*' & EscapePattern(Forms![Form Name]![Control Name]) & '*')" & _
      " ORDER BY Equipment.equipmentName;"