Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASPX页上获取“传递给存储过程的参数太多”_C#_Asp.net_Gridview_Parameters_Sqldatasource - Fatal编程技术网

C# 在ASPX页上获取“传递给存储过程的参数太多”

C# 在ASPX页上获取“传递给存储过程的参数太多”,c#,asp.net,gridview,parameters,sqldatasource,C#,Asp.net,Gridview,Parameters,Sqldatasource,我很难找出这个错误。我在ASPX页面上有一个网格,显示SQLServer2008数据库中存储过程中的数据。当页面加载时,出现以下错误: "Procedure or function <sp_name> has too many arguments specified." 数据源正在传递4个参数,存储过程正在接受4个参数,但是当页面显示时,我得到了上面提到的错误。我是不是遗漏了什么 编辑:下面是模板列的代码。但我不确定这怎么会给SP带来额外的参数 protected

我很难找出这个错误。我在ASPX页面上有一个网格,显示SQLServer2008数据库中存储过程中的数据。当页面加载时,出现以下错误:

"Procedure or function <sp_name> has too many arguments specified."
数据源正在传递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会导致这种情况呢?

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


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

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

        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;
        }
    }
设计时间 在页面的设计视图中,选择GridView并通过单击[>]展开扩展菜单,然后选择刷新架构。这可能会清除您的项目模板,但应该可以,因为您的代码保存在其他地方,即此处

运行时 钩住SqlDataSource。选择事件并在调试模式下检查命令参数

ASPX

编辑

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

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

要尝试的更多内容:

当您刷新页面时, 确保不要使用F5或按键盘 刷新按钮。转到浏览器的 地址字段并按Enter键 没有IsPostBack=true 删除OnClick、CommandName和 来自 林克巴顿的声明
使用探查器并检查真正传递给SP的参数。

它与安全相关,您的web.config必须指示不同的连接字符串设置摘要身份验证或用户登录 而您的存储过程需要它们中的任何一个
检查存储过程的安全性。

我非常怀疑这是一个与安全相关的问题。他会收到一条完全不同的涉及授权的错误消息。我尝试了上面的建议。刷新模式会消除错误,当然我会丢失列定义,但网格显示时不会出错。我尝试按照您的建议记录选择,但是当页面加载时,该方法从未被调用。您确定该方法也适用于存储过程吗?是的,我确定它适用于存储过程。您是否已连接到如上所示的Selecting事件?ASPX:onselection=SqlDataSource1\u选择一旦我添加回“Template”列,我就会得到错误。为什么添加模板列会导致向SP传递更多参数?我以前从未见过这种情况。我确实参与了上述活动。如下所示:onselection=GatewayMerchantDataSource\u selection,我在方法中放入了一条Log4Net信息日志消息。好的,您是否在GatewayMerchantDataSource中插入了一个断点,假设它的作用域至少是受保护的而不是私有的?另外,您可以发布处理row命令impersonate的方法吗?假设他有权限对其数据库运行探查器=
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Development %>"
    SelectCommand="sp_GatewayMerchants" SelectCommandType="StoredProcedure"
    OnSelecting=SqlDataSource1_Selecting>
    ...
protected void SqlDataSource1_Selecting(object sender, System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs e) {
    // check e.Command.Parameters
}
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
    DataSourceID="SqlDataSource1" ShowFooter="True" OnRowDataBound="GridView1_RowDataBound"
    AllowSorting="True" DataKeyNames="MerchantID">