我有以下组合框与sql表中的数据绑定。
我需要根据这些组合框中的选定值提取数据。
例如:如果我将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;
}
}
答案 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.