ストアドプロシージャを呼び出して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
これは、同じ関数で使用される2番目のストアドプロシージャtbl_pref
です。
ALTER PROCEDURE [dbo].[tbl_pref]
@userID int,
@preferenceID int
AS
BEGIN
INSERT INTO tbl_preferences(userID, preferenceID)
VALUES (@userID, @preferenceID)
END
ストアドプロシージャには、入力として5つのパラメーターが必要です。
@userID int,
@userName varchar(50),
@password nvarchar(50),
@emailAddress nvarchar(50),
@preferenceName varchar(20)
したがって、このSP呼び出しに5つのパラメーターすべてを追加する必要があります。
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
私の場合、すべてのパラメーター値が正しく指定されていても、コマンドのタイプが指定されていない場合でも、この例外を受け取りました。
cmd.CommandType = System.Data.CommandType.StoredProcedure;
これは明らかに上記の質問には当てはまりませんが、この場合の例外の説明はあまり明確ではないため、それを指定することにしました。
昨日この問題に遭遇しましたが、ここでの解決策はどれも正確に機能しませんでしたが、正しい方向を示してくれました。
私たちのアプリケーションは、C#で記述されたワークフローツールであり、非常に単純化されており、データベース上にいくつかのストアドプロシージャと、各ストアドプロシージャで使用される各パラメータに関するメタデータのテーブル(名前、順序、データ型、サイズなど)があります。 C#を変更せずに、必要な数の新しいストアドプロシージャを作成できます。
問題の分析により、コードがSqlCommand
オブジェクトのすべての正しいパラメーターを設定していることが示されましたが、一度実行されると、OPが取得したのと同じエラーがスローされました。
さらに分析した結果、一部のパラメーターの値はnull
でした。したがって、SqlCommand
オブジェクトは、SqlParameter
の値を持つ.Parameters
コレクション内のnull
オブジェクトを無視するという結論を出さなければなりません。
私が見つけたこの問題には2つの解決策があります。
ストアドプロシージャでは、@Parameter int
から@Parameter int = NULL
(または必要に応じて他のデフォルト値)のように、各パラメーターにデフォルト値を指定します。
個々のSqlParameter
オブジェクトを生成するコードでは、目的の値がSQLであるnull
の代わりにDBNull.Value
を割り当てるNULL
はトリックを行います。
元のコーダーは先に進み、コードは最初にソリューション1を念頭に置いて作成されましたが、両方の利点を比較検討した結果、ソリューション1に固執すると思います。特定のストアドプロシージャのデフォルト値を指定する方がはるかに簡単ですコードで定義されているように常にNULL
であるのではなく、それを記述するとき。
それが誰かを助けることを願っています。
私の場合、C#側で正しく設定していたにもかかわらず出力パラメータでエラーが発生しましたストアドプロシージャの出力パラメータにデフォルト値を与えるのを忘れていたことがわかりました
ALTER PROCEDURE [dbo].[test]
(
@UserID int,
@ReturnValue int = 0 output --Previously I had @ReturnValue int output
)
私の場合、1つの出力パラメーターを返していましたが、値を返していませんでした。
だからそれを
param.Direction = ParameterDirection.Output;
command.ExecuteScalar();
そして、それはサイズエラーを投げていました。サイズも設定する必要がありました
SqlParameter param = new SqlParameter("@Name",SqlDbType.NVarChar);
param.Size = 10;