他にも同様の質問を投稿した人がかなりいることはわかっていますが、適切な質問を見つけることができないようです.
挿入を実行する単純なストアド プロシージャがあります。
ALTER PROCEDURE [dbo].[usp_CategoryTreeInsert]
@CategoryId Int,
@InvenexNodeId Int,
@ParentNodeId Int,
@NodeId Int,
@Node nvarchar(max),
@NodeQuery nvarchar(max)
AS
BEGIN
BEGIN TRANSACTION
INSERT INTO dbo.CategoryTree(
CategoryId,
InvenexNodeId,
ParentNodeId,
NodeId,
Node,
NodeQuery
)VALUES(
@CategoryId,
@InvenexNodeId,
@ParentNodeId,
@NodeId,
@Node,
@NodeQuery
)
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
Return -1
END
ELSE
BEGIN
COMMIT TRANSACTION
RETURN 1
END
END
次のように、エンタープライズ データ アクセス アプリケーション ブロックを使用して、クラス ライブラリからこの手順を呼び出しています。
(注:私は通常SqlParameter[]
、この方法ではなく a を使用しますが、これは「迅速で汚い」と想定されていました)
SqlCommand Cmd = new SqlCommand("usp_CategoryTreeInsert");
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@CategoryId",SqlDbType.Int, Convert.ToInt32(Dt.Rows[CurrentRow]["CategoryId"]));
Cmd.Parameters.Add("@InvenexNodeId",SqlDbType.Int, Convert.ToInt32(Dt.Rows[CurrentRow]["InvenexNodeId"]));
Cmd.Parameters.Add("@ParentNodeId",SqlDbType.Int, Convert.ToInt32(Dt.Rows[CurrentRow]["ParentNodeId"]));
Cmd.Parameters.Add("@NodeId",SqlDbType.Int, Convert.ToInt32(Dt.Rows[CurrentRow]["NodeId"]));
Cmd.Parameters.AddWithValue("@Node", Dt.Rows[CurrentRow]["Node"]);
Cmd.Parameters.AddWithValue("@NodeQuery", Dt.Rows[CurrentRow]["NodeQuery"]);
Database Db = DatabaseFactory.CreateDatabase("DefaultConnection");
Db.ExecuteNonQuery(Cmd);
返されるエラーは
プロシージャまたは関数には、指定されていないパラメータ「@CategoryId」が必要です
SqlCommand
「Cmd」と、適切に名前が付けられ、入力され、入力されているように見えるすべてのパラメーター値を監視しています。
これは、新鮮な目ですぐに指摘できる比較的単純なものでなければならないと考えています。
誰でも助けることができますか?
よろしくお願いします!
編集:解決策
Sriram が指摘したように、意図したパラメーター値をオーバーロードに不適切に配置しました。
修正されたコードは次のとおりです。
SqlCommand Cmd = new SqlCommand("usp_CategoryTreeInsert");
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@CategoryId",SqlDbType.Int);
Cmd.Parameters["@CategoryId"].Value = Convert.ToInt32(Dt.Rows[CurrentRow]["CategoryId"]);
Cmd.Parameters.Add("@InvenexNodeId",SqlDbType.Int);
Cmd.Parameters["@InvenexNodeId"].Value = Convert.ToInt32(Dt.Rows[CurrentRow]["InvenexNodeId"]);
Cmd.Parameters.Add("@ParentNodeId",SqlDbType.Int);
Cmd.Parameters["@ParentNodeId"].Value = Convert.ToInt32(Dt.Rows[CurrentRow]["ParentNodeId"]);
Cmd.Parameters.Add("@NodeId",SqlDbType.Int);
Cmd.Parameters["@NodeId"].Value = Convert.ToInt32(Dt.Rows[CurrentRow]["NodeId"]);
Cmd.Parameters.AddWithValue("@Node", Dt.Rows[CurrentRow]["Node"]);
Cmd.Parameters.AddWithValue("@NodeQuery", Dt.Rows[CurrentRow]["NodeQuery"]);
Database Db = DatabaseFactory.CreateDatabase("DefaultConnection");
Db.ExecuteNonQuery(Cmd);
めちゃくちゃ迅速な返信をありがとう、Sriram!