【问题标题】:OdbcCommand on Stored Procedure - "Parameter not supplied" error on Output parameter存储过程上的 OdbcCommand - 输出参数上的“未提供参数”错误
【发布时间】:2010-05-09 22:18:55
【问题描述】:

我正在尝试执行存储过程(通过 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 执行该过程,它可以正常工作。

有什么想法吗?谢谢

【问题讨论】:

  • 调试时你的ID参数有什么值?

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


【解决方案1】:

尝试替换:

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

与:

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

更多信息:

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

【讨论】:

    【解决方案2】:

    我不太清楚你的意思

    有一个输入@machine 指定并在 存储过程

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

    @machine nvarchar(32) = null
    

    并不意味着您在 proc 内将 @machine 设置为 null - 这意味着您正在分配一个默认值,以防参数丢失(在这种情况下,null 是值用于缺少的参数)。

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

    【讨论】:

    • 但在调试时,@machine 参数似乎有一个值。
    • @Veer:我觉得萌的回答就是你想要的。
    【解决方案3】:

    带有输入参数和 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");
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      相关资源
      最近更新 更多