ReportViewer控件ControlParameter配置及参数未识别问题求助
问题解决:ReportViewer与SqlDataSource参数绑定错误处理
错误根源分析
- PropertyName无效错误:你把
ControlParameter的ControlId设为rptvwTransactionResearch(ReportViewer控件),但ReportViewer没有对应NumOfTransactions的属性,且未指定PropertyName,导致参数无法获取有效值。 - 标量变量未声明错误:后台代码添加参数时错误地给参数名加了
@前缀,且重复设置SelectCommand导致参数匹配失败;同时混用手动填充DataSet和SqlDataSource绑定,逻辑冲突。 - 控件找不到错误:尝试用
rptvwTransactionResearch$SqlDataSource1作为ControlId是错误的,SqlDataSource是独立控件,不在ReportViewer的命名容器内。
解决方案与代码修正
1. 修改ASPX页面代码
移除无效的ControlParameter,保留SessionParameter,NumOfTransactions参数由后台代码动态添加:
<table style="height: 400px; width: 100%;"> <tr> <td style="vertical-align: top; text-align: left" > <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> <rsweb:ReportViewer ID="rptvwTransactionResearch" runat="server" Height="333px" Width="100%" Visible="False" SizeToReportContent="True"> <LocalReport ReportPath="Reports\rptTransactionResearch.rdlc"> <DataSources> <rsweb:ReportDataSource DataSourceId="SqlDataSource1" Name="TransactionResearch_ResidentResearch" /> </DataSources> </LocalReport> </rsweb:ReportViewer> </td> </tr> </table> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:BANKMDFConnectionString %>" SelectCommand="SELECT r.ResidentID, r.FirstName, r.LastName, rt.TransactionDate, CASE WHEN CharIndex(' From ', rt.TransactionDescription) > 0 THEN substring(rt.TransactionDescription, charindex(' From ', rt.TransactionDescription) + 6, (Len(rt.TransactionDescription) - charindex(' From ', rt.TransactionDescription) + 6)) ELSE ' ' END AS TransactionDescription,rt.Amount FROM Resident AS r LEFT OUTER JOIN ResidentTransactions AS rt ON r.FacilityID = rt.FacilityID AND r.ResidentID = rt.ResidentID WHERE (r.FacilityID = @FacilityID) AND ( @NumOfTransactions = (SELECT count(1) FROM ResidentTransactions WHERE (FacilityID = r.FacilityID) AND residentid = r.residentid)) AND (( (rt.TransactionDate = (SELECT MAX(TransactionDate) AS Expr1 FROM ResidentTransactions AS ResidentTransactions_1 WHERE (FacilityID = r.FacilityID) AND (ResidentID = r.ResidentID) AND (DepositWithdrawalCode = 'D'))) AND (rt.TransactionSeq = (SELECT MAX(TransactionSeq) AS Expr1 FROM ResidentTransactions AS ResidentTransactions_1 WHERE (FacilityID = r.FacilityID) AND (ResidentID = r.ResidentID) AND (TransactionDate = rt.TransactionDate) AND (DepositWithdrawalCode = 'D'))) ) OR Transactionseq is null) Order by ltrim(r.LastName),ltrim(r.FirstName) "> <SelectParameters> <asp:SessionParameter Name="FacilityID" SessionField="FacilityID" Type="Int32" /> <!-- 移除无效的ControlParameter,由后台添加NumOfTransactions参数 --> </SelectParameters> </asp:SqlDataSource>
2. 修改后台C#代码
清理重复逻辑,直接通过SqlDataSource传递参数,不再手动填充DataSet:
// 假设conn已经正确打开 using (SqlCommand cmd = new SqlCommand(strSQL, conn)) { var numOfDays = Int32.Parse(txtParam.Text) * -1; cmd.Parameters.AddWithValue("@FacilityID", Session["FacilityID"].ToString()); cmd.Parameters.AddWithValue("@NumOfDays", numOfDays); cmd.Parameters.AddWithValue("@NumOfTransactions", txtParam.Text); // 清空原有参数避免重复添加 SqlDataSource1.SelectParameters.Clear(); // 添加FacilityID参数(从Session获取) SqlDataSource1.SelectParameters.Add("FacilityID", DbType.Int32, Session["FacilityID"].ToString()); // 添加NumOfTransactions参数(从txtParam获取) SqlDataSource1.SelectParameters.Add("NumOfTransactions", DbType.String, txtParam.Text); // 绑定SqlDataSource并刷新ReportViewer SqlDataSource1.DataBind(); rptvwTransactionResearch.LocalReport.Refresh(); rptvwTransactionResearch.Visible = true; }
关键注意点
SqlDataSource的SelectParameters中参数名不需要加@前缀,SQL语句中的@NumOfTransactions会自动匹配参数名NumOfTransactions。- 不要同时混用手动填充DataSet和SqlDataSource绑定ReportViewer,选择一种方式即可,避免逻辑冲突。
- 如果
NumOfTransactions来自前端输入框,也可以直接用ControlParameter绑定输入框,这样不需要后台手动添加参数,更简洁:<asp:ControlParameter Name="NumOfTransactions" ControlId="txtParam" PropertyName="Text" Type="String" />
内容的提问来源于stack exchange,提问作者brianw921
相关产品推荐
相关产品推荐

