簡體   English   中英

企業庫“過程或功能期望參數未提供”錯誤

[英]Enterprise Library “Procedure or Function Expects Parameter Which Was Not Supplied” Error

我意識到還有很多其他人也提出了類似的問題,但是我似乎找不到確切的答案。

我有一個執行插入操作的簡單存儲過程:

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[]而不是此方法,但這應該是“快速而骯臟的”)

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的迅速回復!

Cmd.Parameters.Add("@CategoryId",SqlDbType.Int, Convert.ToInt32(Dt.Rows[CurrentRow]["CategoryId"]));

在上面的行中,您使用以下add重載

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

如您所見,您在size參數中傳遞了CategoryId ,因此失敗了。

你需要這樣的東西

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

同樣,您在InvenexNodeId,ParentNodeId,NodeId參數中也缺少相同的東西。

您可以使用Parameters.AddWithValue方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM