存储过程的Odbc命令 - 输出参数上的“参数未提供”错误

时间:2010-05-09 22:18:56

标签: c# sql-server-2005 stored-procedures odbc

我正在尝试执行存储过程(通过ODBC驱动程序对SQL Server 2005)并且我收到以下错误:

  

过程或函数'GetNodeID'需要参数'@ID',这是未提供的。

@ID是我的过程的OUTPUT参数,有一个输入@machine,它被指定并在存储过程中设置为null:

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

IF EXISTS(SELECT * FROM Nodes WHERE NodeName=@machine)
BEGIN
    SELECT @ID = (SELECT NodeID FROM Nodes WHERE NodeName=@machine)
END
ELSE
BEGIN
    INSERT INTO Nodes (NodeName) VALUES (@machine)
    SELECT @ID = (SELECT NodeID FROM Nodes WHERE NodeName=@machine)
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执行该过程,它可以正常工作。

有什么想法?感谢

3 个答案:

答案 0 :(得分:6)

尝试更换:

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

使用:

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

更多信息:

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

答案 1 :(得分:0)

我不确定你的意思

  

有一个@machine输入   指定并在。中设置为null   存储过程

在你的proc签名中,这一行:

@machine nvarchar(32) = null

并不意味着您在proc中将@machine设置为null - 这意味着您要分配一个默认值,以便在参数丢失时使用(在本例中为{{1} }是用于丢失参数的值。

如果您在没有传递任何参数的情况下调用此存储过程,则会发生关于null丢失的错误(@ID不会被标记为问题,因为它已定义了默认值) 。您的代码示例对我来说很好 - 您确定存储的proc不是从程序中的其他位置调用的(在没有添加参数的地方)吗?

答案 2 :(得分:0)

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

创建存储过程:

  

创建过程proc_name @ parm1 varchar(20),@ parm2 varchar(10)作为开始插入table_name值(@ parm1,@ parm2);结束


此代码适用于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");

    }