我正在尝试执行存储过程(通过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执行该过程,它可以正常工作。
有什么想法?感谢
答案 0 :(得分:6)
尝试更换:
OdbcCommand Cmd = new OdbcCommand("GetNodeID", _Connection);
Cmd.CommandType = CommandType.StoredProcedure;
使用:
OdbcCommand Cmd = new OdbcCommand("{call GetNodeID(?,?)}", _Connection);
更多信息:
答案 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");
}