C# 在ASPX页上获取“传递给存储过程的参数太多”
我很难找出这个错误。我在ASPX页面上有一个网格,显示SQLServer2008数据库中存储过程中的数据。当页面加载时,出现以下错误: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
"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">