如何编写基于组合框选择的单个 sql 查询?

Posted

技术标签:

【中文标题】如何编写基于组合框选择的单个 sql 查询?【英文标题】:how to write a single sql query based on combobox selection? 【发布时间】:2017-03-31 03:03:59 【问题描述】:

我有一个用户通过组合框输入值的 winform。我将组合框值分配给搜索数据库。如果没有选择,则 SQL 服务器查询不应使用该列进行过滤。

例子-

if (string.IsNullOrEmpty(combobox1.text)) 
  .....Select * from country

else if (combobox1.selectedindex > -1) 
   ....Select * from country where city_name = combobox.text

如果用户从组合框中选择或不选择值,是否有办法编写单个查询而不是使用多个“IF”条件。

【问题讨论】:

【参考方案1】:

参数化也很重要:

private const string _select = "select * from country";

void DoSomething()

     string sql = string.Empty;
     if (combobox1.SelectedIndex > -1)
     
         command.Parameters.AddWithValue("@1",  (string)combobox1.SelectedValue);
         sql = " where city_name = @1";
     
     sql = _select + sql;
     command.CommandText = sql;
     command.Execute...

@un-lucky 问我如何处理多种情况 - 这是一种方法

var conditions = new List<string>();     
if (/* condition 1*/)

    command.Parameters.AddWithValue("@2",  (string)cboN.SelectedItem);
    conditions.Add("col1 = @2");

if (/* condition 2*/)

    command.Parameters.AddWithValue("@3",  textBoxN.Text);
    conditions.Add("col2 = @3");


if (conditions.Count > 0)
    sql = _select + " where " + string.Join(" AND ", conditions.ToArray());

【讨论】:

如果条件不多会怎样? @un-lucky 那么这是不同的问题。有很多方法可以解决它。一 - 将每个条件构建到field = @parameter 并添加到列表中。检查列表是否包含任何项目,然后添加 WHERE 并使用 " AND " 作为分隔符加入您的列表项目。这是一种解决方案 @un-lucky 其实有点不同。 现在看起来不错..!【参考方案2】:

只有当你有两个条件时,你才能使用速记:

 string query = string.Format("Select * from country0", string.IsNullOrEmpty(combobox1.text) ? "" : " where city_name = " + combobox1.text);

希望对你有帮助!

【讨论】:

" where city_name = " + combobox1.text 【参考方案3】:

我认为你必须尝试这样的参数化:

StringBuilder queryBuilder = new StringBuilder("Select * from country Where 1=1 ");
SqlCommand cmdSql = new SqlCommand();

if (combobox1.selectedindex > -1) 

   queryBuilder.Append(" And city_name = @city_name "); 
   cmdSql.Parameters.Add("@city_name", SqlDbType.VarChar).Value = combobox.text;  

else if(Condition 2)

   queryBuilder.Append(" And column2 = @col2 "); 
   cmdSql.Parameters.Add("@col2", SqlDbType.VarChar).Value = "some Value here;  

// Build the query like this
cmdSql.CommandText= = queryBuilder.ToString();
cmdSql.Connection = conObject;
// Here you can execute the command

【讨论】:

【参考方案4】:

我有样品,试试看

string select = this.combobox1.GetItemText(this.combobox1.SelectedItem); cm1 = new SqlCommand("Select * from country where city_name=@select or @select is null", con);
            cm1.Parameters.Add("@select", SqlDbType.NVarChar, 50);
            cm1.Parameters["@select"].Value = select;
            dap = new SqlDataAdapter(cm1);
            ds = new System.Data.DataSet();
            dap.Fill(ds, "DATABASE");
            //DataGridView1.DataSource = ds.Tables[0]; get data

【讨论】:

以上是关于如何编写基于组合框选择的单个 sql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

从表单上的多个组合框控制 Access SQL 查询

如何将两个组合框的选定项与单个数据源分开?

如何在组合框中返回未绑定列的值

如何在 SQL 语句中引用组合框并在 VBA 中运行该语句

如何在 C# 中存储 SQL 查询的结果字符串

如何从我的SQL SERVER获取我的数据库列表,并使用javafx将其添加到组合框中