2013-10-27 59 views
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[],而不是这种方法,但是这应该是一个“快速和肮脏”)

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”的手表,以及所有的参数值,看起来都是正确命名,输入和填充。

我认为这是一个相对简单的事情,一个新鲜的眼睛可以很快指出。

任何人都可以帮忙吗?

非常感谢!

编辑:解

如斯利拉姆指出的,我在过载已经把预定的参数值不正确。

改正的代码如下:

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

感谢这么多的疯狂快速回复斯利拉姆!

回答

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

在上面行你使用以下过载添加

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,节点Id参数同样的事情为好。

+1

完美...我不敢相信我没有看到。 – CHSIndependet

0

你可以使用Parameters.AddWithValue方法

相关问题