首先,我正在使用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 [联系人姓名变量]
答案 0 :(得分:0)
詹姆斯是对的(评论中)
由于AND
有higher 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#,但应该有一些内置的方法将参数传递给你的查询。
编辑:
现在看来,在评论中,这里还有其他事情发生了
我建议使用以下调试方法:
LIKE
条件的查询;验证结果是否符合您的预期,除此之外:发布您的架构和数据 - 因为它只有3行 - 不会受到伤害。