如何在代码隐藏中使用 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 绑定到网格视图,方法是将其声明为数据源。
我有一个代码隐藏方法,它使用 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 绑定到网格视图,方法是将其声明为数据源。