C# 返回整个数据库的SQLite查询
首先,我使用C,以及SQLite的C包装器 我试图使用以下代码查询我的SQLite数据库,但它不断返回整个数据库,而不是预期的结果。我对sql查询非常陌生,所以请查看我的查询,如果您看到任何可能导致问题的内容,请告诉我C# 返回整个数据库的SQLite查询,c#,sqlite,C#,Sqlite,首先,我使用C,以及SQLite的C包装器 我试图使用以下代码查询我的SQLite数据库,但它不断返回整个数据库,而不是预期的结果。我对sql查询非常陌生,所以请查看我的查询,如果您看到任何可能导致问题的内容,请告诉我 public DataTable queryDatabase(String column, String filter) { string SQL = "SELECT " + column + " FROM SUBCONTRACTOR " + filter
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 + "%'");
一如既往,谢谢你的帮助
编辑:
通过我的查询,我正在尝试选择所有具有
全球政策!=真的还是阿尔卑斯!=为true或WCPolicy!=正确或错误的策略!=真的
及
BusinessName-LIKE[此处为BusinessName变量]
及
类似于[contact name variable here]的ContactName詹姆斯的评论是正确的。
因为和has than OR,您的WHERE子句本质上说:
WHERE
GLOPolicy != 'True' OR ALPolicy != 'True' OR WCPolicy != 'True' OR
(ULPolicy != 'True' AND BusinessName LIKE '%x%' AND Contact LIKE '%y%')
您可以通过在所有ORd条件周围添加参数来修复,以确保在与ANDs混合之前对其进行评估:
另外:我认为您的代码容易受到攻击。我对C语言不是很流利,但应该有一些内置的方法来将参数传递给查询
编辑:
现在看来,在评论中,这里还发生了其他事情。
我建议使用以下调试方法:
使用推荐的传递参数的方式,
尝试一次仅使用一个类似条件运行查询;验证结果是否符合预期,
确保您传递的参数包含您期望的参数。
除此之外:发布您的架构和数据,因为它只有3行不会有什么坏处。我们只能猜测,但我猜您的WHERE子句实际上与数据库中的所有记录都匹配。不确定SQLLite的规则,但可能您需要在所有这些OR子句周围加一个括号?取决于您的意图…我真正想要的是有人查看我的查询,因为不,它不匹配数据库中的所有记录@詹姆斯:括号会放在哪里?你是说括号还是括号?它很容易受到SQL注入攻击,我现在很懒,但我很感激你指出这一点。我将尝试上面的方法并返回这里。现在它返回0条记录,而在我当前的沙盒数据库中,它应该返回3条记录中的2条。所有3条记录的GLOPolicy=True,但其中2条记录的ALPolicy!=符合事实的这两个人没有带括号出现。这非常令人沮丧。~>:@代码:在这两种情况下,ALPolicy是空的吗?@Adam:不,它们是假的。False或NULL在这种情况下是相同的,对吗?假设它们都不等于True。如果它们为NULL,则需要添加或ALPolicy为NULL,因为三值逻辑3VL:
WHERE
(GLOPolicy != 'True' OR ALPolicy != 'True' OR WCPolicy != 'True' OR
ULPolicy != 'True') AND BusinessName LIKE '%x%' AND Contact LIKE '%y%'