的OdbcCommand在存储过程 - “参数未提供”在输出参数错误

问题描述:

我试图(通过ODBC驱动程序对SQL Server 2005)执行一个存储过程,我收到以下错误:的OdbcCommand在存储过程 - “参数未提供”在输出参数错误

Procedure or Function 'GetNodeID' expects parameter '@ID', which was not supplied.

@ID是我的过程OUTPUT参数,存在被指定和被设置为空值在存储过程中的输入@machine:

ALTER PROCEDURE [dbo].[GetNodeID] 
@machine nvarchar(32) = null, 
@ID int OUTPUT 
AS 
BEGIN 
SET NOCOUNT ON; 

IF EXISTS(SELECT * FROM Nodes WHERE [email protected]) 
BEGIN 
    SELECT @ID = (SELECT NodeID FROM Nodes WHERE [email protected]) 
END 
ELSE 
BEGIN 
    INSERT INTO Nodes (NodeName) VALUES (@machine) 
    SELECT @ID = (SELECT NodeID FROM Nodes WHERE [email protected]) 
END 
END 

以下是我使用设置的参数的代码,并拨打程序:

 OdbcCommand Cmd = new OdbcCommand("GetNodeID", _Connection); 
     Cmd.CommandType = CommandType.StoredProcedure; 

     Cmd.Parameters.Add("@machine", OdbcType.NVarChar); 
     Cmd.Parameters["@machine"].Value = Environment.MachineName.ToLower(); 

     Cmd.Parameters.Add("@ID", OdbcType.Int); 
     Cmd.Parameters["@ID"].Direction = ParameterDirection.Output; 

     Cmd.ExecuteNonQuery(); 
     _NodeID = (int)Cmd.Parameters["@Count"].Value; 

我也试过使用Cmd.ExecuteScalar没有成功。如果我在执行命令之前断开,我可以看到@machine有一个值。

如果我直接从Management Studio执行该过程,它可以正常工作。

有什么想法?由于

+0

贵ID参数有什么样的价值,同时调试? – Amsakanna 2010-05-10 04:40:47

尝试更换:

OdbcCommand Cmd = new OdbcCommand("GetNodeID", _Connection); 
Cmd.CommandType = CommandType.StoredProcedure; 

有了:

OdbcCommand Cmd = new OdbcCommand("{call GetNodeID(?,?)}", _Connection); 

更多信息:

http://support.microsoft.com/kb/310130

+0

你完全正确!这解决了这个问题。谢谢! – Aaron 2010-05-10 23:10:27

我不太清楚你

there is an input @machine which is specified and is set to null in the stored procedure

的意思在你的进程内的签名,这条线:

@machine nvarchar(32) = null 

并不意味着你设置@machine里面空proc - 这意味着你正在分配一个默认值以供在缺失参数的情况下使用(在这种情况下,null是用于缺失参数的值)。

如果您不调用任何参数而调用此存储过程(@machine由于它具有已定义的默认值,所以不会被标记为问题),因此获取有关@ID丢失的错误将会发生。你的代码示例对我来说看起来很好 - 你确定存储过程没有从程序中的其他地方调用过(没有参数被添加的地方)?

+0

但是在调试时,@machine参数看起来有一个值。 – Amsakanna 2010-05-10 04:40:13

+0

@Veer:我认为Moe的答案就是你想要的。 – MusiGenesis 2010-05-10 14:13:56

存储过程的输入参数和ODBC连接:

创建一个存储过程:

create procedure proc_name @parm1 varchar(20), @parm2 varchar(10) as begin insert into table_name values(@parm1,@parm2);end


这个代码在SQL Server.

private void button1_Click(object sender, EventArgs e) 
    { 
     string name = txtname.Text; 
     string num = txtnum.Text; 
     OdbcConnection con = new OdbcConnection("dsn=naveenk_m5"); 
     OdbcCommand cmd = new OdbcCommand("{call proc1(?,?)}",con); 
     cmd.Parameters.Add("@parm1", OdbcType.VarChar).Value=name; 
     cmd.Parameters.Add("@parm2", OdbcType.VarChar).Value = num; 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     MessageBox.Show("inserted a row"); 

    }