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

How to use parameterized queries in SqlDataSource.SelectCommand in code behind?

我有一个代码隐藏方法,它使用 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");
}

但这似乎不起作用。

我没有考虑到您正在使用数据源对象:

向 SQL 数据源添加一个 ASP 参数:

<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 网络表单中定义 sql 参数。我用虚拟值 "default" 定义了一个参数。因此,如果在您不更改参数@LoanType 后面的代码中的参数等于 "default" 字符串并且 @LoanType="default" 将为所有行 returns true 并且它不会考虑 LoanType =@LoanType。 但是,如果您更改@LoanType="default" returns 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);
}

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

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

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