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 UserName=@username and   PrinterName=@printer and TimeSubmitted between @to and @from";  

ユーザーがいくつかのテキスト ボックスに入力しない場合、クエリで、テキスト ボックスの条件がクエリで無視されます。私が何を望んでいるのか理解していただければ幸いです。

4

2 に答える 2

2

StringBuilderを使用して SQL クエリを動的に構築できますが、これによりコードが SQL インジェクション攻撃を受けやすくなり、動的 SQLを使用して SQL Server でストアド プロシージャを作成することを検討する必要があります。

ただし、コードでクエリを作成する必要がある場合は、StringBuilder の例を次に示します。

  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();
}
于 2012-12-25T17:25:02.587 に答える
0

この拡張機能を見てみましょう: SqlBuilder チュートリアル

この拡張機能を使用すると、このような動的 SQL クエリを作成できます。

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"); 
}
于 2012-12-25T17:08:14.610 に答える