【问题标题】:Getting 'too many parameters passed' to stored procedure on ASPX page将“太多参数传递”到 ASPX 页面上的存储过程
【发布时间】:2011-05-17 21:54:15
【问题描述】:

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

"Procedure or function <sp_name> has too many arguments specified."

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

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
        DataSourceID="SqlDataSource1" ShowFooter="True" OnRowDataBound="GridView1_RowDataBound"
        AllowSorting="True">
        <Columns>
            <asp:BoundField DataField="MerchantID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
                SortExpression="MerchantID" />
            <asp:BoundField DataField="MerchantName" HeaderText="Merchant" SortExpression="MerchantName" />
            <asp:BoundField DataField="RapidTuitionID" HeaderText="RapidTuition ID" SortExpression="RapidTuitionID" />
            <asp:BoundField DataField="DateCreated" HeaderText="Enrolled" SortExpression="DateCreated" />
            <asp:TemplateField HeaderText="Commands">
                <ItemTemplate>
                    <asp:LinkButton ID="ImpersonateUserLinkButton" runat="server" OnClick="Command_Click"
                        CommandName="impersonate" CommandArgument='<%# Eval("MerchantID") %>' CssClass="table_command">Impersonate</asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <EmptyDataTemplate>
            No data to display.
        </EmptyDataTemplate>
        <PagerStyle CssClass="pager" />
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Development %>"
        SelectCommand="sp_GatewayMerchants" SelectCommandType="StoredProcedure">
        <SelectParameters>
            <asp:ControlParameter ControlID="PromotionPlaceHolderTop$StartDate" Name="StartDate"
                DefaultValue="1/1/2010" PropertyName="Text" Type="DateTime" />
            <asp:ControlParameter ControlID="PromotionPlaceHolderTop$EndDate" Name="EndDate"
                DefaultValue="12/31/2010" PropertyName="Text" Type="DateTime" />
            <asp:ControlParameter ControlID="PromotionPlaceHolderTop$StatusActive" DefaultValue="true"
                Name="StatusActive" PropertyName="Checked" Type="Boolean" />
            <asp:ControlParameter ControlID="PromotionPlaceHolderTop$StatusDeactive" DefaultValue="true"
                Name="StatusDeactive" PropertyName="Checked" Type="Boolean" />
        </SelectParameters>
    </asp:SqlDataSource>

这是存储过程中的代码:

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 会导致这种情况呢?

【问题讨论】:

    标签: c# asp.net gridview parameters sqldatasource


    【解决方案1】:

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

    GridView 可能正在向 SP 传递意外参数。

    【讨论】:

      【解决方案2】:

      从您的代码看来,您传递了 4 个参数,但让我们确保这是在设计和运行时发生的情况。

      设计时间

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

      运行时间

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

      ASPX

      <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Development %>"
          SelectCommand="sp_GatewayMerchants" SelectCommandType="StoredProcedure"
          OnSelecting=SqlDataSource1_Selecting>
          ...
      

      CS

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

      编辑

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

      <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
          DataSourceID="SqlDataSource1" ShowFooter="True" OnRowDataBound="GridView1_RowDataBound"
          AllowSorting="True" DataKeyNames="MerchantID">
      

      编辑 2

      更多尝试:

      1. 当您“刷新”页面时, 确保不要使用 F5 或点击 刷新按钮。转到浏览器的 地址字段并按 Enter 至 没有 IsPostBack = true
      2. 删除 OnClick、CommandName 和 CommandArguemnt 来自 LinkBut​​ton 的声明

      【讨论】:

      • 我尝试了上面的建议。刷新架构会使错误消失,当然我会丢失列定义,但网格显示没有错误。我尝试按照您的建议记录“选择”,但是在页面加载时永远不会调用该方法。您确定该方法也适用于存储过程吗?
      • 是的,我确信它适用于存储过程。如上所示,您是否挂上了 Selecting 事件? ASPX: OnSelecting=SqlDataSource1_Selecting
      • 一旦我添加了“模板”列,我就会收到错误消息。为什么添加模板列会导致向 SP 传递更多参数?我以前从未见过。
      • 我确实像上面那样挂钩了这个事件。像这样:OnSelecting="GatewayMerchantDataSource_Selecting",我在方法中放了一条 Log4Net Info 日志消息。
      • 好的,你是否在 GatewayMerchantDataSource 中插入了一个断点(假设它的范围至少是受保护的而不是私有的)?另外,您可以发布处理“模拟”行命令的方法吗?
      【解决方案3】:

      使用 Profiler 并检查真正传递给 SP 的参数。

      【讨论】:

      • 假设他有权针对他的数据库运行 Profiler =)
      【解决方案4】:

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

      【讨论】:

      • 我非常怀疑这是一个与安全相关的问题。他会收到一条完全不同的涉及授权的错误消息。
      猜你喜欢
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多