【问题标题】:SQLite Query returning entire databaseSQLite 查询返回整个数据库
【发布时间】:2010-12-19 06:41:57
【问题描述】:

首先,我使用的是 C#,以及 SQLite 的 C# 包装器。

我正在尝试使用以下代码查询我的 SQLite 数据库,但它不断返回整个数据库,而不是预期的。我对 sql 查询非常陌生,所以请查看我的查询,如果您发现任何可能导致问题的内容,请告诉我。

public DataTable queryDatabase(String column, String filter)
    {
        string SQL = "SELECT " + column + " FROM SUBCONTRACTOR " + filter;
        SQLiteCommand cmd = new SQLiteCommand(SQL);
        cmd.Connection = connection;
        SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
        DataSet ds = new DataSet();
        try
        {
            da.Fill(ds);
            DataTable dt = ds.Tables[0];
            return dt;
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
            return null;
        }
        finally
        {
            cmd.Dispose();
            connection.Close();
        }
    }

这是我正在运行以调用上述方法的代码...

dataGridView.DataSource = sqliteQuery.queryDatabase("*", "WHERE GLOPolicy != 'True' OR ALPolicy != 'True' OR WCPolicy != 'True' OR ULPolicy != 'True' AND BusinessName LIKE '%" + bySubBusinessNameMaskedTextBox.Text + "%' AND Contact LIKE '%" + bySubContactNameMaskedTextBox.Text + "%'");

一如既往地感谢您的帮助!

编辑: 通过我的查询,我试图选择所有具有...的记录

(GLOPolicy != true OR ALPolicy != true OR WCPolicy != True OR ULPolicy != True)

BusinessName LIKE [此处为企业名称变量]

ContactName LIKE [此处为联系人姓名变量]

【问题讨论】:

  • 我们只能猜测,但我猜你的 WHERE 子句实际上匹配数据库中的所有记录。
  • 不确定 SQLLite 的规则,但也许您需要在所有这些 OR 子句周围加上括号?取决于你的意图是什么......
  • 我真正想要的只是有人查看我的查询,因为不,它与数据库中的所有记录都不匹配。 @James:括号会去哪里?你的意思是括号还是括号?

标签: c# sqlite


【解决方案1】:

詹姆斯是对的(在评论中)。
因为ANDhigher precedenceOR 多,所以您的WHERE 子句本质上说:

WHERE 
    GLOPolicy != 'True' OR ALPolicy != 'True' OR WCPolicy != 'True' OR 
    (ULPolicy != 'True' AND BusinessName LIKE '%x%' AND Contact LIKE '%y%')

您可以通过在所有ORd 条件周围添加括号来修复,以确保在与ANDs 混合之前对其进行评估:

WHERE 
    (GLOPolicy != 'True' OR ALPolicy != 'True' OR WCPolicy != 'True' OR 
    ULPolicy != 'True') AND BusinessName LIKE '%x%' AND Contact LIKE '%y%'

另外:我认为您的代码容易受到SQL-injection 攻击。我不精通 C#,但应该有一些内置方法可以将参数传递给您的查询。


编辑:
现在看来,在 cmets 中,这里发生了其他事情。
我会建议以下调试方法:

  1. 使用推荐的参数传递方式,
  2. 尝试一次只使用LIKE 条件之一运行查询;验证结果是否符合您的预期,
  3. 确保您传递的参数符合您的预期。

除此之外:发布您的架构和数据(因为它只有 3 行)不会有什么坏处。

【讨论】:

  • 它很容易受到 SQL 注入攻击,我现在很懒,但我感谢你指出这一点。我会尝试上述方法并返回这里。
  • 现在它返回 0 条记录,此时它应该返回我当前沙箱数据库中 3 条总记录中的 2 条。所有 3 条记录的 GLOPolicy = True,但 3 条中有 2 条的 ALPolicy != True。这两个没有出现在括号中。这非常令人沮丧。 ~>:(
  • @CODE: 在这两种情况下 ALPolicy 是否为 NULL?
  • @Adam:不,他们是假的。不过,在这种情况下,False 或 NULL 将是相同的,对吗?鉴于它们都不等于 True。
  • 如果它们为 NULL,由于三值逻辑 (3VL),您需要添加 OR ALPolicy IS NULLen.wikipedia.org/wiki/…
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 2016-11-01
  • 2021-01-20
  • 2021-07-01
  • 2022-01-16
  • 2020-08-28
  • 2016-02-12
相关资源
最近更新 更多