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

我使用企业数据访问应用程序块从类库中调用此过程,如下所示。

(注意:我通常使用 aSqlParameter[]而不是这种方法,但这应该是一种“又快又脏”的方法)

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);

非常感谢斯里拉姆的快速回复!

4

2 回答 2

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

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

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

如您所见,您正在传递CategoryId参数size,因此失败了。

你需要这样的东西

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 回答
0

您可以使用 Parameters.AddWithValue 方法

于 2013-10-27T09:14:46.803 回答