2012-12-25 81 views
0

我有下面的代碼在後面的代碼爲btnShowReport_Click忽略某些文本框在查詢

SqlDataSource1.SelectParameters.Clear(); 
SqlDataSource1.SelectParameters.Add("username", txtUsername.Text); 
SqlDataSource1.SelectParameters.Add("printer", ddlPrinter.Text); 
SqlDataSource1.SelectParameters.Add("to", Date.convertDateSolar2Gregorian(txtDateFrom_datepicker.Text)); 
SqlDataSource1.SelectParameters.Add("from", Date.convertDateSolar2Gregorian(txtDateTo_datepicker.Text)); 
SqlDataSource1.SelectCommand = "SELECT * FROM JobLog WHERE [email protected] and [email protected] and TimeSubmitted between @to and @from"; 

我想,當用戶不填寫一些文本框,在查詢後,文本框的標準被忽略在查詢中。 我希望你明白我想要什麼。

回答

2

可以動態建立使用StringBuilder SQL查詢,然而這使你的代碼容易出現SQL注入攻擊,你應該使用Dynamic SQL

這裏的StringBuilder的,而看看如何創建SQL Server中的存儲過程例如,如果您絕對必須在代碼中構建查詢:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Dictionary<string, string> parameters = new Dictionary<string, string>(); 
    SqlDataSource1.SelectParameters.Clear(); 

    string name = txtName.Text; 
    string surname = txtSurname.Text; 

    if (name.Length > 0) 
    { 
     SqlDataSource1.SelectParameters.Add("Name", txtName.Text); 
     parameters.Add("Name", name); 
    } 

    if (surname.Length > 0) 
    { 
     SqlDataSource1.SelectParameters.Add("Surname", txtSurname.Text); 
     parameters.Add("Surname", surname); 
    } 

    SqlDataSource1.SelectCommand = GetSelectQuery("Customers", parameters); 
    //Bind SqlDataSource1 to gridview etc... 
} 

private string GetSelectQuery(string table, Dictionary<string, string> parameters) 
{ 
    var query = new System.Text.StringBuilder(); 
    query.Append(String.Format("SELECT * FROM {0}", table)); 

    for (int i = 0; i < parameters.Count; i++) 
    { 
     var param = parameters.ElementAt(i); 
     if (i == 0) 
      //Add the first parameter 
      query.Append(String.Format(" WHERE {0}='{1}' ",param.Key, param.Value)); 
     else 
      query.Append(String.Format(" AND {0}='{1}'", param.Key, param.Value)); 
    } 
    return query.ToString(); 
} 
0

看看這個擴展:SqlBuilder Tutorial

有了這個擴展,你可以建立動態SQL querys這樣。

void DynamicSql(int? categoryId, int? supplierId) { 

    var query = SQL 
     .SELECT("ID, Name") 
     .FROM("Products") 
     .WHERE() 
     ._If(categoryId.HasValue, "CategoryID = {0}", categoryId) 
     ._If(supplierId.HasValue, "SupplierID = {0}", supplierId) 
     .ORDER_BY("Name DESC"); 
}