簡體   English   中英

參數化的存儲過程返回“指定的參數過多”

[英]Parameterized stored procedure returning “too many arguments specified”

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

只是在黑暗中一槍,直到我們看到像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

更改行:WHERE UserProfile.UserID =
用於:WHERE UserProfile.UserID IN

我也剛剛遇到了這個問題,但我設法對其進行了排序。

我的更新來自網格。
我的網格是從另一個存儲過程填充的。 在“選擇存儲過程”中,我將字段名稱更改為更加用戶友好的名稱,例如

select AU.UserName [Member],

后來,當我檢查時,Update命令傳遞了update存儲過程所需的所有參數以及與重命名字段相對應的其他參數。

我從Select過程中刪除了重命名並更新了SqlDataSource。 現在,僅傳遞正確數量的字段。

然后,我剛剛重命名了GridBoundColumn.eg的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();
    }
}

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM