如何在代码中使用SqlDataSource.SelectCommand中的参数化查询?

时间:2016-03-21 17:02:54

标签: c# parameterized-query

我有一个代码隐藏方法,它使用SqlDataSource对象从数据库中检索数据,然后用作网格视图的数据源来显示记录。我需要有条件地为我的SelectCommand查询的WHERE子句添加另一个条件,并且需要通过参数将数据传递给查询。我该怎么做?

SqlDataSource sds = new SqlDataSource();

sds.SelectCommand = "Select CustomerName, LoanNumber, LoanDate FROM Loan WHERE IsActive = 1 ";

if (filterRecord != "All") {   // DDL filter on page, all records by default
    sds.SelectCommand += "AND LoanType = ??";   //this is where I need to parameterize my query
}

我想像

if (filterRecord != "All") {  
    sds.SelectCommand += "AND LoanType = @LoanType";
    sds.SelectParameters.Add("@LoanType", "Mortgage");
}

但这似乎不起作用。

2 个答案:

答案 0 :(得分:1)

我建议切换到SqlCommand对象来定义查询并使用SqlDataReader对象读取记录。您可以使用类似以下的内容向查询添加参数:

SqlCommand cmd = new SqlCommand(queryString, connection);
cmd.Parameters.AddWithValue("@paramName", value);

之后,您可以像往常一样将SqlDataReader绑定到网格视图,方法是将其声明为数据源。

答案 1 :(得分:0)

我没有考虑您使用的是数据源对象:

将ASP参数添加到SQL数据源:

<asp:Parameter Name="LoanType" Type="String" DefaultValue="default" />

将select命令更改为:

"Select CustomerName, LoanNumber, LoanDate FROM Loan WHERE IsActive = 1 AND (@LoanType="default" or LoanType =@LoanType)"

然后在您的代码中执行此操作:

if (filterRecord != "All") {  
    sds.SelectParameters("LoanType").DefaultValue="Mortgage"
}

说明 在编辑后面的代码之前,需要在ASP webform中定义sql参数。我用虚拟值&#34;默认&#34;定义了一个参数。因此,如果你不改变参数后面的参数@LoanType等于&#34;默认&#34;字符串和@LoanType =&#34;默认&#34;将为所有行返回true,它将不会考虑LoanType = @ LoanType。 但是,如果更改@LoanType =&#34;默认&#34;后面的代码中的参数。返回false,它将检查每行的LoanType = @ LoanType,这将产生你想要的东西!

我的老答案: 当您不使用sql数据源并且使用sql命令

时,这很好
if (filterRecord != "All") {  
    SqlParameter Parameter = new SqlParameter();
    Parameter.ParameterName = "@LoanType";
    Parameter.SourceColumn = "LoanType";
    Parameter.SqlDbType = SqlDbType.NVarChar;
    Parameter.Value = "Mortgage";

    sds.SelectCommand += "AND LoanType = @LoanType";
    sds.SelectParameters.Add(Parameter);
}