Параметризованная хранимая процедура, возвращающая «слишком много аргументов указано» - PullRequest
1 голос
/ 16 февраля 2010

Я пишу приложение ASP.NET (C #) в Visual Studio 2008 и подключаюсь к SQLExpress 2005.

При попытке обновить элемент управления FormView, связанный с SqlDataSource, с помощью параметризованной хранимой процедуры, я постоянно получаю экран с сообщением «слишком много аргументов указано».

Я попытался очистить список и добавить все параметры вручную перед вызовом метода DataSource.Update (). Я проверил с точкой останова, и непосредственно перед запуском метода Update коллекция UpdateParameters содержит 8 аргументов, которые я указал в своей хранимой процедуре, поэтому я знаю, что моя коллекция соответствует тому, что я просил.

Передача команд обновления типа = "text", содержащих оператор EXEC, будет работать, но мне нужно, чтобы она работала, вызывая саму процедуру.

Кто-нибудь еще сталкивался с этими "дополнительными аргументами" или я играю в 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 голосов
/ 16 февраля 2010

изменить строку: ГДЕ UserProfile.UserID =
за: ГДЕ UserProfile.UserID В

0 голосов
/ 03 марта 2010

Я только что столкнулся с этим, но мне удалось отсортировать его.

Мое обновление было из сетки.
Моя сетка была заполнена из другой хранимой процедуры. В этой хранимой процедуре Select я изменил имена полей на более удобные для пользователя. например,

select AU.UserName [Member],

Позже, когда я проверял, команда Update передавала все параметры, требуемые хранимой процедурой обновления, и дополнительные параметры, соответствующие переименованным полям.

Я удалил переименование из процедуры выбора и обновил SqlDataSource. Теперь передается только правильное количество полей.

Тогда я просто переименовал тег HeaderText в GridBoundColumn.e.g.

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

Надеюсь, это поможет

0 голосов
/ 16 февраля 2010

Просто выстрел в темноте, пока мы не увидим какой-то код, как спросил Джеймс, но вы настраиваете атрибут DataKeyNames? Когда я только начинал с FormView и GridView, я вручную добавил значение первичного ключа, используя скрытое поле, и отправил атрибут DataKeyNames, и я думаю, что это вызвало отправку значения в хранимую процедуру дважды, а не один раз.

Просто предположение

EDIT: Вы пробовали

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...