1

Visual Studio 2008 で ASP.NET(C#) アプリケーションを作成し、SQLExpress 2005 に接続しています。

パラメータ化されたストアド プロシージャを使用して SqlDataSource にバインドされた FormView コントロールを更新しようとすると、「指定された引数が多すぎます」というエラー画面が常に表示されます。

DataSource.Update() メソッドを呼び出す前に、リストをクリアしてすべてのパラメーターを手動で追加しようとしました。ブレークポイントを使用してテストしたところ、Update メソッドが起動する直前に、ストアド プロシージャで指定した 8 つの引数が UpdateParameters コレクションに保持されているため、コレクションが求めたものに準拠していることがわかります。

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)
4

3 に答える 3

0

ジェームズが尋ねたようなコードが表示されるまで、暗闇の中でのショットですが、DataKeyNames 属性を設定していますか? FormView と GridView を使い始めたとき、隠しフィールドを使用して主キーの値を手動で追加し、DataKeyNames 属性を送信したため、値がストアド プロシージャに 1 回ではなく 2 回送信されたと思います。

ただの推測

編集:試しましたか

    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
于 2010-02-16T02:20:52.083 に答える
0

行を変更: WHERE UserProfile.UserID =
for: WHERE UserProfile.UserID IN

于 2010-02-16T07:03:42.840 に答える
0

私もこれに遭遇したばかりですが、なんとかソートできました。

私の更新はグリッドからのものでした。
私のグリッドは、別のストアド プロシージャから取り込まれました。その Select ストアド プロシージャで、フィールド名をより使いやすい名前に変更しました。

select AU.UserName [Member],

後で確認したところ、Update コマンドは、更新ストアド プロシージャに必要なすべてのパラメータと、名前が変更されたフィールドに対応する追加のパラメータを渡していました。

Select プロシージャから名前の変更を削除し、SqlDataSource を更新しました。正しい数のフィールドのみが渡されるようになりました。

次に、GridBoundColumn.eg の HeaderText タグの名前を変更しました。

HeaderText="Member"

標準の GridView ではなく RadGrid を使用していますが、そこでも機能するようです。

次を使用して、渡されたパラメーターの数を確認しました。

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

お役に立てれば

于 2010-03-03T17:51:32.000 に答える