我有一个代码隐藏方法,它使用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");
}
但这似乎不起作用。
答案 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);
}