的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执行该过程,它可以正常工作。
有什么想法?由于
尝试更换:
OdbcCommand Cmd = new OdbcCommand("GetNodeID", _Connection);
Cmd.CommandType = CommandType.StoredProcedure;
有了:
OdbcCommand Cmd = new OdbcCommand("{call GetNodeID(?,?)}", _Connection);
更多信息:
你完全正确!这解决了这个问题。谢谢! – 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
丢失的错误将会发生。你的代码示例对我来说看起来很好 - 你确定存储过程没有从程序中的其他地方调用过(没有参数被添加的地方)?
但是在调试时,@machine参数看起来有一个值。 – Amsakanna 2010-05-10 04:40:13
@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");
}
贵ID参数有什么样的价值,同时调试? – Amsakanna 2010-05-10 04:40:47