SQLite Query返回整个数据库

时间:2010-12-18 09:22:19

标签: c# sqlite

首先,我正在使用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 [联系人姓名变量]

1 个答案:

答案 0 :(得分:0)

詹姆斯是对的(评论中) 由于ANDhigher precedence而不是OR,因此您的WHERE条款基本上表示:

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

您可以通过在所有OR d条件周围添加parens来确保在与AND混合之前对其进行评估来解决:

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

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


编辑:
现在看来,在评论中,这里还有其他事情发生了 我建议使用以下调试方法:

  1. 使用推荐的传递参数的方式,
  2. 尝试一次仅运行一个LIKE条件的查询;验证结果是否符合您的预期,
  3. 确保您传递的参数包含您期望的内容。
  4. 除此之外:发布您的架构和数据 - 因为它只有3行 - 不会受到伤害。