【问题标题】:Query does not return anything查询不返回任何内容
【发布时间】:2012-04-14 08:37:39
【问题描述】:

我正在尝试从数据库中获取一些结果,但查询失败!

String sqlFindModel = "SELECT * FROM [PRODUCT] WHERE [PN] LIKE ('*" + textBox1.Text + "*')";

当我修剪“WHERE [PN] LIKE ...”部分时,它工作正常。 当我将 LIKE 替换为 '=' 并查找确切值时,它可以工作。

我很困惑。

PS - 有趣的是,直接在 ACCESS 中查询时,必须使用 *;但是在使用 C# 连接 MS Access 时,需要使用 %... 有趣!

【问题讨论】:

  • 1) 使用参数 2) % 是 LIKE 运算符,而不是 *
  • 确保清理输入,否则恶意用户最终可能会通过 sql 注入攻击删除您的表或执行各种不正当的代码。
  • @Maciej 手动清理 SQL 的输入在大多数情况下注定要失败。您几乎总是最好使用参数化查询或等效查询,您无需自己负责对其进行清理。
  • 您实际上可以在访问本身 (dao/ansi 89) 中使用 *,它的 oledb 使用 ansi 92 接口,所以想要 %

标签: c# .net sql ms-access oledbconnection


【解决方案1】:

* 不用于 SQL LIKE 语句中的通配符 - % 是。

但是,您不应该只更改您的代码以使用% - 您应该修复您的代码,使其容易受到SQL injection attacks 的攻击。您应该改用参数化 SQL。有关示例,请参阅 OleDbCommand.Parameters 的文档。

【讨论】:

    【解决方案2】:

    考虑 Access 的未记录的 ALike 比较运算符是否会使这更容易处理。

    "SELECT * FROM [PRODUCT] WHERE [PN] ALike '%" + textBox1.Text + "%'"
    

    ALike 表示 Access 的 db 引擎需要 ANSI 通配符(% 和 _ 而不是 * 和 ?)。因此,无论您是在 Access 会话内运行,还是使用 OleDb 从 Access 会话外运行,您的查询都可以正常工作。

    我看到有人反对 ALike,因为它不是标准 SQL。但是,在为其他数据库引擎调整 Access 查询时,我更喜欢将 ALike 更改为 Like 而不必更改 * 和 ?到 % 和 _。

    【讨论】:

      【解决方案3】:

      尝试将 * 字符替换为 %

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-24
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多