在ASPX页面上将“太多参数传递给”存储过程

我无法搞清楚这个错误。 我在ASPX页面上有一个网格,它显示SQL Server 2008数据库中存储过程的数据。 页面加载时,我收到以下错误:

"Procedure or function  has too many arguments specified." 

这是网格和数据源的代码:

         <asp:LinkButton ID="ImpersonateUserLinkButton" runat="server" OnClick="Command_Click" CommandName="impersonate" CommandArgument='' CssClass="table_command">Impersonate     No data to display.    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="" SelectCommand="sp_GatewayMerchants" SelectCommandType="StoredProcedure">        

这是存储过程的代码:

 ALTER PROCEDURE [dbo].[sp_GatewayMerchants] -- Add the parameters for the stored procedure here @StartDate DateTime, @EndDate DateTime, @StatusActive bit, @StatusDeactive bit AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT m.MerchantID AS [ID], m.MerchantName, CASE m.StatusFlag WHEN 1 THEN 'Active' ELSE 'Deactive' END AS [Status], m.RapidTuitionID, m.DateCreated FROM Merchant m WHERE (CONVERT(varchar,m.DateCreated,112) BETWEEN CONVERT(varchar,CONVERT(DATETIME,@StartDate,101),112) AND CONVERT(varchar,CONVERT(DATETIME,@EndDate,101),112)) AND ( (@StatusActive = 1 AND m.StatusFlag = 1) OR (@StatusDeactive = 1 AND m.StatusFlag = 0) ) ORDER BY m.MerchantName END 

数据源传递4个参数,存储过程接受4,但是当页面显示时,我得到上面提到的错误。 我在这里错过了什么吗?

编辑:这是模板列背后的代码。 但我不确定这会如何导致SP的额外参数。

  protected void Command_Click(object sender, EventArgs e) { var merchantID = Convert.ToInt32(((LinkButton)sender).CommandArgument); switch (((LinkButton)sender).CommandName) { case "impersonate": var gs = GatewaySession.Parse(Page.User.Identity.Name); gs.Role = GatewaySession.RoleEnum.Merchant; gs.MerchantID = merchantID; gs.CustomerID = -1; FormsAuthentication.SetAuthCookie(gs.ToString(), false); Page.Session["MerchantID"] = gs.MerchantID; Response.Redirect("/Merchant/Default.aspx"); break; } } 

如果我删除ASP:LINKBUTTON代码工作。 那么为什么LINKBUTTON会导致这种情况呢?

使用Profiler并检查哪些参数实际传递给SP。

从你的代码看起来你传递了4个参数,但是让我们确保在设计和运行期间发生了什么。

设计时间

在页面的“设计”视图中,选择GridView并单击[>]展开扩展菜单,然后选择刷新架构。 这可能会清除您的项目模板,但这应该没问题,因为您已将代码保存在其他位置(即此处)。

运行

挂钩到SqlDataSource.Selecting事件并在调试模式下检查命令参数。

ASPX

  ... 

CS

 protected void SqlDataSource1_Selecting(object sender, System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs e) { // check e.Command.Parameters } 

编辑

您可以尝试的另一件事是设置Data的DataKeyNames属性

  

编辑2

更多尝试:

  1. 当您“刷新”页面时,请确保不要使用F5或点击“刷新”按钮。 转到浏览器的地址字段,然后按Enter键以不具有IsPostBack = true
  2. 从LinkBut​​ton的声明中删除OnClick,CommandName和CommandArguemnt

尝试添加SQLDataSource.Selecting事件处理程序并检查传递给存储过程的参数。 参数可以在SqlDataSourceSelectingEventArgs.Arguments找到。

GridView可能会将意外参数传递给SP。

它与安全性有关,您的web.config必须指明不同的连接字符串设置(摘要式身份validation或用户登录),而您的存储过程要求其中一个检查您的存储过程安全性。