C#,根据表单中给出的搜索条件从SQL中提取数据

时间:2016-06-15 10:19:00

标签: c# sql search

我有以下组合框与sql表中的数据绑定。

  • cmbClassification
  • cmbAuthor
  • cmbPublisher
  • cmbType

我需要根据这些组合框中的选定值提取数据。

例如:如果我将cmbClassification留空并为其他3个组合框选择值,则我的datagridview应显示特定作者,特定发布者和广告的所有数据。具体类型,无论分类如何。

我知道如何为两个搜索项目执行此操作(使用if)。但我有4个项目,不知道。

两个实例的代码

我认为这4个组合框有10种搜索模式。我怎么处理这个?如果只有2个组合框,将有3种模式,我将按如下方式处理:

string con = @"Data Source=ABU_DHABI-1\SQLEXPRESS;Initial Catalog=SLIS;Integrated Security=True";


private void btnView_Click(object sender, EventArgs e)
{
    if (cmbAuth.Text == "" && cmbClassi.Text =="")
    {
        SqlConnection Icon = new SqlConnection(con);
        String Query = "SELECT * FROM Books";
        SqlCommand Command = new SqlCommand(Query, Icon);
        SqlDataAdapter da = new SqlDataAdapter(Command);
        DataTable dt = new DataTable();
        da.Fill(dt);
        BrDataGrid.DataSource = dt;
    }

    if (cmbAuth.Text == "" && cmbClassi.Text != "")
    {

        SqlConnection Icon = new SqlConnection(con);
        String Query = "SELECT * FROM Books WHERE Classification ='" + cmbClassi.Text + "'"; ;
        SqlCommand Command = new SqlCommand(Query, Icon);
        SqlDataAdapter da = new SqlDataAdapter(Command);
        DataTable dt = new DataTable();
        da.Fill(dt);
        BrDataGrid.DataSource = dt;

    }

    if (cmbAuth.Text != "" && cmbClassi.Text == "")
    {

        SqlConnection Icon = new SqlConnection(con);
        String Query = "SELECT * FROM Books WHERE Author ='" + cmbAuth.Text + "'"; ;
        SqlCommand Command = new SqlCommand(Query, Icon);
        SqlDataAdapter da = new SqlDataAdapter(Command);
        DataTable dt = new DataTable();
        da.Fill(dt);
        BrDataGrid.DataSource = dt;

    }
}

1 个答案:

答案 0 :(得分:0)

这个逻辑:

if (cmbAuth.Text == "" && cmbClassi.Text != "")
{
    // build and execute the entire query
}

会导致if块数量的指数增加以及重复代码的 ton 。当然,这很糟糕。

相反,通过应用过滤器数量的线性增加来构建查询一次。逻辑上更像是这样:

var query = "SELECT * FROM Books WHERE 1 = 1";
var parameters = new List<SqlParameter>();
if (!string.IsNullOrEmpty(cmbAuth.Text))
{
    query = query + " AND Author = @Author";
    parameters.Add(new SqlParameter("@Author", cmbAuth.Text));
}
// repeat for each input
// then build and execute the connection/command objects from the query and parameters

基本上,您使用每个条件构建查询,然后执行结果。作为奖励,这也是使用查询参数而不是您当前的SQL注入代码。您可以进一步添加一些改进,例如使用StringBuilder而不是连接字符串,或者在构建参数对象时使用更明确的SQL数据类型等。

这类似于LINQ中常用的方法,其中一个可能有这样的东西:

var books = db.Books;
if (!string.IsNullOrEmpty(cmbAuth.Text))
    books = books.Where(b => b.Author == cmbAuth.Text);
if (!string.IsNullOrEmpty(cmbClassi.Text))
    books = books.Where(b => b.Classification == cmbClassi.Text);
// etc.