【问题标题】:Parameterized stored procedure returning "too many arguments specified"参数化存储过程返回“指定的参数过多”
【发布时间】:2011-01-17 05:23:26
【问题描述】:

我正在 Visual Studio 2008 中编写一个 ASP.NET(C#) 应用程序并连接到 SQLExpress 2005。

在尝试使用参数化存储过程更新绑定到 SqlDataSource 的 FormView 控件时,我经常收到一个错误屏幕,提示“指定的参数过多”。

在调用 DataSource.Update() 方法之前,我已尝试清除列表并手动添加所有参数。我已经使用断点进行了测试,在 Update 方法触发之前,UpdateParameters 集合包含我在存储过程中指定的 8 个参数,因此我知道我的集合符合我的要求。

传入包含 EXEC 语句的 type="text" 更新命令将起作用,但我需要通过调用过程本身来使其工作。

有没有其他人遇到过这些“额外的论点”,还是我在玩 EPR 并追逐虚构的变量?

CREATE PROC spUpdateUserProfile
 @UserNameVar nvarchar(256),
 @DisplayNameVar varchar(30),
 @FNameVar varchar(20),
 @LNameVar varchar(20),
 @EmailVar varchar(30)=NULL,
 @LocationVar varchar(100)=NULL,
 @BirthdateVar smalldatetime=NULL,
 @BiographyVar varchar(2000)=NULL

AS

UPDATE UserProfile
SET UserDisplayName = @DisplayNameVar,
 UserFName = @FNameVar,
 UserLName = @LNameVar,
 UserSharedEmail = @EmailVar,
 UserLocation = @LocationVar,
 UserDOB = @BirthdateVar,
 UserBiography = @BiographyVar
WHERE UserProfile.UserID = 
(SELECT UserProfile.UserID FROM UserProfile
JOIN aspnet_Users ON UserProfile.UserID = aspnet_Users.UserId
WHERE aspnet_Users.UserName = @UserNameVar)

【问题讨论】:

  • 您可能需要输入存储过程的声明,以及调用存储过程的代码,否则一切都是猜测。
  • 您能否在调用时运行 SQL Profiler 以查看数据库服务器实际接收到的内容?

标签: c# asp.net stored-procedures arguments sqldatasource


【解决方案1】:

只是在黑暗中摸索,直到我们可以看到像 James 所问的一些代码,但是您是否设置了 DataKeyNames 属性?当我开始使用 FormView 和 GridView 时,我使用隐藏字段手动添加了主键值并发送了 DataKeyNames 属性,我认为这导致该值被发送到存储过程两次而不是一次。

只是猜测

编辑: 你试过了吗

    UPDATE UserProfile
    SET UserDisplayName = @DisplayNameVar,
      UserFName = @FNameVar,
      UserLName = @LNameVar,
      UserSharedEmail = @EmailVar,
      UserLocation = @LocationVar,
      UserDOB = @BirthdateVar,
      UserBiography = @BiographyVar
    WHERE UserProfile.UserID = aspnet_Users.UserId
      AND aspnet_Users.UserName = @UserNameVar

【讨论】:

  • 我已经查看了该字段并尝试确保它是空白的。我什至在代码隐藏中手动清除并尝试了将值放入其中并将其排除在其他声明之外的排列。没用。
【解决方案2】:

换行: WHERE UserProfile.UserID =
为了: 在哪里 UserProfile.UserID

【讨论】:

  • 提供相同的响应并且本质上是相同的语句。我已经直接在 SQL Management Studio 中测试了我的 SP,它的行为符合预期。从 ASP.NET 应用程序传递命令会发生故障
【解决方案3】:

我也遇到过这种情况,但我已经设法对其进行了排序。

我的更新来自网格。
我的网格是从另一个存储过程填充的。 在那个 Select 存储过程中,我将字段名称更改为更用户友好的名称 例如

select AU.UserName [Member],

后来,当我检查时,更新命令正在传递更新存储过程所需的所有参数以及与重命名字段相对应的额外参数。

我从 Select 过程中删除了重命名并更新了 SqlDataSource。 现在只传递正确数量的字段。

然后我只是重命名了 GridBoundColumn.e.g 的 HeaderText 标记。

HeaderText="Member"

我使用的是 RadGrid 而不是标准的 GridView,但它似乎也可以在那里工作。

我使用以下方法检查了传递参数的数量:

protected void  SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    for (int x = 0; x <= e.Command.Parameters.Count - 1;x++ )
    {
        string Type = e.Command.Parameters[x].GetType().ToString();
        string Value = e.Command.Parameters[x].ToString();
    }
}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2017-11-22
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多