43

ストアド プロシージャを呼び出して SQL Server データベースにデータを挿入しようとしていますが、エラーが発生します。

プロシージャまたは関数 'SHOWuser' には、指定されていないパラメーター '@userID' が必要です。

私のストアド プロシージャは と呼ばれSHOWuserます。徹底的にチェックしましたが、パラメーターが欠落していません。

私のコードは次のとおりです。

public void SHOWuser(string userName, string password, string emailAddress, List<int> preferences)
{
        SqlConnection dbcon = new SqlConnection(conn);

        try
        { 
            SqlCommand cmd = new SqlCommand();

            cmd.Connection = dbcon;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "SHOWuser";

            cmd.Parameters.AddWithValue("@userName", userName);
            cmd.Parameters.AddWithValue("@password", password);
            cmd.Parameters.AddWithValue("@emailAddress", emailAddress);

            dbcon.Open();

            int i = Convert.ToInt32(cmd.ExecuteScalar());

            cmd.Parameters.Clear();
            cmd.CommandText = "tbl_pref";

            foreach (int preference in preferences)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@userID", Convert.ToInt32(i));
                cmd.Parameters.AddWithValue("@preferenceID", Convert.ToInt32(preference));

                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            dbcon.Close();
        }

ストアド プロシージャは次のとおりです。

ALTER PROCEDURE [dbo].[SHOWuser]
(
    @userName varchar(50),
    @password nvarchar(50),
    @emailAddress nvarchar(50)
)
AS
BEGIN
    INSERT INTO tbl_user(userName, password, emailAddress) 
    VALUES (@userName, @password, @emailAddress)

    SELECT
        tbl_user.userID, tbl_user.userName,
        tbl_user.password, tbl_user.emailAddress, 
        STUFF((SELECT ',' + preferenceName 
               FROM tbl_pref_master
               INNER JOIN tbl_preferences ON tbl_pref_master.preferenceID = tbl_preferences.preferenceID
               WHERE tbl_preferences.userID = tbl_user.userID
               FOR XML PATH ('')), 1, 1, ' ' ) AS Preferences
    FROM
        tbl_user

    SELECT SCOPE_IDENTITY();
END

tbl_prefこれは、同じ関数で使用される2 番目のストアド プロシージャです。

ALTER PROCEDURE [dbo].[tbl_pref]
    @userID int,
    @preferenceID int
AS
BEGIN
    INSERT INTO tbl_preferences(userID, preferenceID) 
    VALUES (@userID, @preferenceID)
END
4

7 に答える 7

182

私の場合、すべてのパラメーター値が正しく指定されていても、コマンドのタイプが指定されていない場合でも、この例外を受け取りました。

cmd.CommandType = System.Data.CommandType.StoredProcedure;

これは上記の質問では明らかに当てはまりませんが、この場合は例外の説明があまり明確ではないため、それを指定することにしました。

于 2014-09-18T09:45:35.993 に答える
13

ストアド プロシージャは、入力として 5 つのパラメーターを想定しています

@userID int, 
@userName varchar(50), 
@password nvarchar(50), 
@emailAddress nvarchar(50), 
@preferenceName varchar(20) 

したがって、5 つのパラメーターすべてをこの SP 呼び出しに追加する必要があります。

    cmd.CommandText = "SHOWuser";
    cmd.Parameters.AddWithValue("@userID",userID);
    cmd.Parameters.AddWithValue("@userName", userName);
    cmd.Parameters.AddWithValue("@password", password);
    cmd.Parameters.AddWithValue("@emailAddress", emailAddress);
    cmd.Parameters.AddWithValue("@preferenceName", preferences);
    dbcon.Open();

PS: これらのパラメーターが何のためにあるのかは明確ではありません。SP本体でこれらのパラメータを使用しないため、SPは次のよ​​うになります。

ALTER PROCEDURE [dbo].[SHOWuser] AS BEGIN ..... END
于 2013-10-31T10:21:46.630 に答える
8

私の場合、C#側で正しく設定していたにもかかわらず、出力パラメーターでエラーが発生しましたストアドプロシージャの出力パラメーターにデフォルト値を与えるのを忘れていたことがわかりました

ALTER PROCEDURE [dbo].[test]
(
                @UserID int,
                @ReturnValue int = 0 output --Previously I had @ReturnValue int output
)
于 2015-08-12T22:54:00.203 に答える
4

私の場合、1 つの出力パラメータを返していて、値を返していませんでした。
に変更しました

param.Direction = ParameterDirection.Output;
command.ExecuteScalar();

そして、サイズエラーをスローしていました。サイズも設定する必要がありました

SqlParameter param = new SqlParameter("@Name",SqlDbType.NVarChar);
param.Size = 10;
于 2015-11-18T17:04:23.257 に答える