You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码添加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个关键错误上,逐一修正即可:

  1. 错误添加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());
    
  2. 移除重复数据源绑定设置
    你已经通过SqlDataAdapter填充DataSet并绑定到ReportViewer,又设置了DataSourceId = "SqlDataSource1",这会导致ReportViewer尝试用SqlDataSource重新获取数据,而此时参数配置错误触发报错。直接移除该行:

    // 删除此行
    // rptvwRejectionTransactions.LocalReport.DataSources[0].DataSourceId = "SqlDataSource1";
    
  3. 确保参数名称与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:35:19