代码添加SqlDataSource SelectParameters时出现标量变量未声明错误
问题:代码添加SqlDataSource的SelectParameters时出现“必须声明标量变量‘@FacilityID’”错误
手动在ASPX页面配置SqlDataSource的SelectParameters(包含另外两个日期参数)时可正常运行,但通过代码添加参数时触发错误。已通过SqlCommand添加对应参数,但问题依旧。
错误提示
必须声明标量变量“@FacilityID”
现有代码
SqlDataAdapter adpReport; DataSet dsReport; ReportDataSource rds = new ReportDataSource(); strSQL = "SELECT ********* WHERE Facility.FacilityId = @FacilityID and DirectDepositRejections.TransactionDate >= @txtFromDate And DirectDepositRejections.TransactionDate <= @txtToDate"; using (SqlConnection conn = new SqlConnection(DBConnection.connectionString())) { conn.Open(); using (SqlCommand cmd = new SqlCommand(strSQL, conn)) { cmd.Parameters.AddWithValue("@FacilityID", Session["facilityID"].ToString()); cmd.Parameters.AddWithValue("@txtFromDate", txtFromDate.Text); cmd.Parameters.AddWithValue("@txtToDate", txtToDate.Text); adpReport = new SqlDataAdapter(cmd); dsReport = new DataSet("TransactionHistory_ResidentTransactions"); adpReport.Fill(dsReport, "TransactionHistory_ResidentTransactions"); rds.Name = "RejectionReport_RejectionDataSet"; rds.Value = dsReport.Tables[0]; rptvwRejectionTransactions.LocalReport.DataSources.Add(rds); rptvwRejectionTransactions.LocalReport.DataSources[0].DataSourceId = "SqlDataSource1"; SqlDataSource1.InsertParameters.Add("@r.FacilityID", System.Data.DbType.String, Session["FacilityID"].ToString()); SqlDataSource1.SelectCommand = strSQL; SqlDataSource1.DataBind(); } ReportParameter[] params1 = new ReportParameter[1]; params1[0] = new ReportParameter("FacilityID", Session["FacilityID"].ToString(), false); rptvwRejectionTransactions.LocalReport.SetParameters(params1); rptvwRejectionTransactions.LocalReport.Refresh();
ASPX页面中可正常运行的SqlDataSource1配置
<SelectParameters> <%--<asp:SessionParameter Name="FacilityID" SessionField="FacilityID" Type="Int32" />--%> <asp:ControlParameter Name="txtFromDate" ControlID="txtFromDate" Type="String"/> <asp:ControlParameter Name="txtToDate" ControlID="txtToDate" Type="String"/> </SelectParameters>
解决方法
问题出在3个关键错误上,逐一修正即可:
错误添加InsertParameters而非SelectParameters
当前代码给SqlDataSource1添加的是InsertParameters,但SQL是查询语句,应添加到SelectParameters集合,且参数名不要带@r.前缀,要与SQL中的@FacilityID对应。同时注意FacilityID的类型(ASPX注释显示为Int32,不要用String):// 替换错误的InsertParameters代码 SqlDataSource1.SelectParameters.Add("FacilityID", System.Data.DbType.Int32, Session["FacilityID"].ToString());移除重复数据源绑定设置
你已经通过SqlDataAdapter填充DataSet并绑定到ReportViewer,又设置了DataSourceId = "SqlDataSource1",这会导致ReportViewer尝试用SqlDataSource重新获取数据,而此时参数配置错误触发报错。直接移除该行:// 删除此行 // rptvwRejectionTransactions.LocalReport.DataSources[0].DataSourceId = "SqlDataSource1";确保参数名称与SQL完全匹配
SQL中的参数是@FacilityID,添加到SelectParameters的Name属性只需写FacilityID(无需@前缀),SqlDataSource会自动处理前缀匹配。
修正后的核心代码片段:
rds.Name = "RejectionReport_RejectionDataSet"; rds.Value = dsReport.Tables[0]; rptvwRejectionTransactions.LocalReport.DataSources.Add(rds); // 清空原有参数,避免重复 SqlDataSource1.SelectParameters.Clear(); // 正确添加所有查询参数 SqlDataSource1.SelectParameters.Add("FacilityID", System.Data.DbType.Int32, Session["FacilityID"].ToString()); SqlDataSource1.SelectParameters.Add("txtFromDate", System.Data.DbType.String, txtFromDate.Text); SqlDataSource1.SelectParameters.Add("txtToDate", System.Data.DbType.String, txtToDate.Text); SqlDataSource1.SelectCommand = strSQL; SqlDataSource1.DataBind();
内容的提问来源于stack exchange,提问作者brianw921
相关产品推荐
相关产品推荐

