我正在用C#创建一个小的Visual Studio Windows窗体应用程序,我使用SQLite作为我的数据库。假设数据库存储学校俱乐部成员的数据,并且它们具有他们所处的州的值。我正在尝试创建参数化查询字符串,以便如果用户在我的程序中选择“所有状态”,那么它将加载所有成员。但如果他们选择一个特定的州,那么它只会显示生活在该州的成员。在使用参数化查询字符串时,如何在WHERE USstate IS NOT NULL
和string queryString = @"Select * from Membership WHERE USstate = @state;";
List<SQLiteParameter> paramList = new List<SQLiteParameter>();
paramList = addStateParam(paramList);
private List<SQLiteParameter> addStateParam(List<SQLiteParameter> paramList)
{
if (!checkBoxFilterAllStates.Checked)
{
string selectedState = comboBoxFilterState.Items[comboBoxFilterState.SelectedIndex].ToString();
var usState = new SQLiteParameter("@state", selectedState);
paramList.Add(usState);
}
else
{
var usState = new SQLiteParameter("@state", "IS NOT NULL");
paramList.Add(usState);
}
return paramList;
}
之间动态切换?我希望动态选择状态的值,但如果选择“所有状态”(复选框),则应显示数据库中的所有记录。
对我不起作用的代码示例:
USstate = @state
我尝试将USstate @state
更改为@state
,然后将"= " + selectedState
替换为IS NOT NULL
或@state
,但如果之前没有等号IS NOT NUll
,每次都会出现语法或逻辑错误。但是,如果我保留等号,那么{{1}}代码将无效。
如何动态修复此问题?提前致谢!对不起,如果我太冗长或多余。
答案 0 :(得分:0)
Select * from Membership WHERE USstate = @state
将此更改为
Select * from Membership WHERE USstate like @state
之后
var usState = new SQLiteParameter("@state", selectedState);
到
var usState = new SQLiteParameter("@state","%"+selectedState+"%");
最后
var usState = new SQLiteParameter("@state", "IS NOT NULL");
到
var usState = new SQLiteParameter("@state", "%");
答案 1 :(得分:0)
如果未选中该复选框,则您将拥有&gt; UsState = IS NOT NULL 你不能用“=” - Operator来检查它。如果你使用带有choosetring的sqlite命令作为命令文本,你可以这样做:
SQLiteCommand cmd = new SQLiteCommand(Selectingtring); cmd.Parameters.AddWithValue(“@ state”,“=”+ state);
或者
cmd.Parameters.AddWithValue(“@ state”,“IS NOT NULL”);
答案 2 :(得分:0)
如果查询中有WHERE USstate = @state
,则会将列值与作为参数传递的字符串值进行比较。 (这是参数的全部目的,以避免被解释为SQL命令。)
您必须更改查询本身:
if (!checkBoxFilterAllStates.Checked)
{
queryString = @"Select * from Membership WHERE USstate = @state;";
...
paramList.Add(usState);
}
else
{
queryString = @"Select * from Membership WHERE USstate IS NOT NULL;";
}