我想执行此命令
select * from table1 where id='"+comboBox1.Text+"'and name='"+comboBox2.Text+"'
但是如果它们是空的,我不希望它们被考虑,例如如果combobox1.Text
为空,我希望命令就像
select * from table1 where name='"+comboBox2.Text+"'
答案 0 :(得分:2)
您可以使用
等文本框进行检查if (comboBox1.Text.Trim().Length == 0) {
// your query
}
else{
// other query
}
但您应该使用参数化查询。像这样构建您的查询会让您对SQL注入开放。
所以你的SQL字符串应该是
select * from table1 where id=@id and name=@name
在执行查询之前,将参数添加到命令对象中。
答案 1 :(得分:0)
您可以随时构建查询,并保护自己免受SQL注入:
(我是从内存中写的,应该编译......)
using (var conn = new SqlConnection("..."))
{
var sb = new StringBuilder("SELECT * FROM table1 WHERE");
using (var cmd = new SqlCommand { Connection = conn })
{
if (!String.IsNullOrEmpty(comboBox1.Text))
{
sb.Append(" id = @ID");
cmd.Parameters.AddWithValue("@ID", int.Parse(comboBox1.Text));
}
if (!String.IsNullOrEmpty(comboBox2.Text))
{
sb.Append(" name = @NAME");
cmd.Parameters.AddWithValue("@NAME", comboBox2.Text);
}
var query = sb.ToString();
cmd.CommandText = query.EndsWith("WHERE") ? query.Remove(query.Length - 5) : query;
conn.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// do whatever you need to do with your data
}
}
}
}
要记住的事情......
如果您有十几个if
块而不是两个块,这可能会失控,然后开始在这些块中嵌套更多if
块。维护将成为一场噩梦。
如果您只有一些条件,可能只是更容易创建一些单独的查询并确定调用哪一个而不是像这样动态构建查询。
答案 2 :(得分:0)
我找到了我想要的解决方案
MySqlDataAdapter cmd = new MySqlDataAdapter(" select * from table1 where(ID = @ id or @ id2)and(name = @ name or @ name2)",co);
if (comboBox1.Text == "")
{
cmd.SelectCommand.Parameters.AddWithValue("@id", "1");
cmd.SelectCommand.Parameters.AddWithValue("@id2", "1");
}
else
{
cmd.SelectCommand.Parameters.AddWithValue("@id", comboBox1.Text);
cmd.SelectCommand.Parameters.AddWithValue("@id2", "0");
}
if (comboBox2.Text == "")
{
cmd.SelectCommand.Parameters.AddWithValue("@name", "1");
cmd.SelectCommand.Parameters.AddWithValue("@name2", "1");
}
else
{
cmd.SelectCommand.Parameters.AddWithValue("@name", comboBox1.Text);
cmd.SelectCommand.Parameters.AddWithValue("@name2", "0");
}
//感谢大家的帮助,我用你给我的所有东西来创建这个解决方案