参数化存储过程返回“指定的参数太多”

时间:2010-02-16 01:23:29

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

我正在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)

3 个答案:

答案 0 :(得分:0)

只是在黑暗中拍摄,直到我们看到像詹姆斯问的一些代码,但你是否设置了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

答案 1 :(得分:0)

更改行: WHERE UserProfile.UserID =
对于: 在哪里UserProfile.UserID IN

答案 2 :(得分:0)

我刚刚遇到过这个,但我已经设法对它进行排序。

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

select AU.UserName [Member],

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

我从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();
    }
}

希望这有帮助