0

他にも同様の質問を投稿した人がかなりいることはわかっていますが、適切な質問を見つけることができないようです.

挿入を実行する単純なストアド プロシージャがあります。

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!

4

2 に答える 2

0

Parameters.AddWithValue メソッドを使用できます

于 2013-10-27T09:14:46.803 に答える
0
Cmd.Parameters.Add("@CategoryId",SqlDbType.Int, Convert.ToInt32(Dt.Rows[CurrentRow]["CategoryId"]));

上記の行では、次の add のオーバーロードを使用しています

public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);

ご覧のとおりCategoryIdsizeパラメーターを渡しているため、これは失敗します。

このようなものが必要です

var param = new SqlParameter("@CategoryId",SqlDbType.Int);
param.Value = Dt.Rows[CurrentRow]["CategoryId"];
Cmd.Parameters.Add(param);

また、InvenexNodeId、ParentNodeId、NodeId パラメータにも同じものがありません。

于 2013-10-27T08:39:15.290 に答える