4

よろしくお願いいたします。大変感謝しております。

「プロシージャまたは関数に指定された引数が多すぎます」という理由で、スタック オーバーフローやその他の Google の結果を 2 時間にわたって精査した後、有用なヘルプが見つかりませんでした。その理由は、指定された引数が多すぎるか、引数の名前が間違っているか、または型が間違っている可能性があるとどこでも読んだからです。これらのどれも私の場合には当てはまりません。これが私のコードです:

CREATE PROCEDURE dbo.sproc_UpdateInfo 

(
@Name nvarchar(40),
@UserId varchar(50),
@Password varchar(50),
@Address nvarchar(120)
)

AS
Update tbl_Users SET Name=@Name, Password=@Password, Address=@Address WHERE UserId=@UserId


RETURN

そして、これがC#側のものです:

SqlCommand sqlCmd = new SqlCommand();
sqlCmd.CommandText = "sproc_UpdateInfo";
sqlCmd.CommandType = CommandType.StoredProcedure;

sqlCmd.Parameters.Add("@Name", SqlDbType.NVarChar, 40).Value = name;

sqlCmd.Parameters.Add("@UserId", SqlDbType.VarChar, 50).Value = userID;
sqlCmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = password;
sqlCmd.Parameters.Add("@Address", SqlDbType.NVarChar, 120).Value = address;

SqlConnection sqlConn = new SqlConnection(connectionString);

sqlCmd.Connection = sqlConn;

try
{
    sqlCmd.Connection.Open();

    int rowaffected = sqlCmd.ExecuteNonQuery(); //Error occurs here
    return rowaffected;
}
catch (SqlException se)
{
    throw new Exception("SqlException: sqlstr=" + sqlCmd.CommandText, se);
}
finally
{
    sqlCmd.Dispose();
    sqlConn.Close();
}
4

3 に答える 3

10

これに変更して、エラーが消えるかどうか教えてください...

sqlCmd.Parameters.Add("@Name", SqlDbType.NVarChar, 40).Value = name ?? "";

sqlCmd.Parameters.Add("@UserId", SqlDbType.VarChar, 50).Value = userID ?? "";
sqlCmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = password ?? "";
sqlCmd.Parameters.Add("@Address", SqlDbType.NVarChar, 120).Value = address ?? "";

また、コードからクエリを実行するときにサーバーでトレースを実行します: (方法は次のとおりです: http://databases.about.com/od/sqlserver/ht/trace.htm )

実行結果がどのように見えるか (sproc が実際にどのように実行されているか) と、それが呼び出されているかどうかを教えてください。

ここには魔法はありません。いくつかのことが起こっている可能性があります:

間違った DB またはサーバーに接続している、または接続していると思われる同じバージョンの sproc を実行していません。sproc のスキーマを確認してください。実行している sproc が dbo であると確信していますか。dboではないパラメーターが少ない別のバージョンはありませんか?これは私を数回得ました。誤って間違ったスキーマで sproc を変更/作成してしまい、コードでスキーマが指定されていない場合、ログインしているユーザーのデフォルトのスキーマが代わりに実行されます。本当に、トレースを実行する必要があります。これは、このような問題の基本的なトラブルシューティングです。SQL が何を実行しようとしているのかを実際に確認する必要があります。そのコードをコピーして、ここのコメント セクションに貼り付けます。そのコードで同じエラーが発生しますか? これはスキーマの混乱であり、複数のバージョンがあるに違いありません。失礼に聞こえますが、しかし、それか、あなたが思っているのと同じサーバー/データベースにいないかのどちらかです。私たちの最高に起こります!:)

もう1つのことが起こっている可能性があります。マスターデータベースにそのsprocのバージョンはありますか? その場合、接続先の DB にある sproc ではなく、実行されることに注意してください。マスターDBを確認してください。そこで作成し、パラメーターが少ない場合、それが問題になる可能性があります。

于 2013-11-13T23:14:13.363 に答える
2

このエラーは、実際には誤解を招くものであり、正しくありません。

プロシージャまたは関数に指定された引数が多すぎます

実際の問題は、ストアド プロシージャの選択と更新には同じパラメータが必要です。そうしないと、このエラーが発生します。本当に直感的ではありません。マイクロソフトの典型だと思います。

于 2016-10-15T16:00:29.090 に答える