[英]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.