2010-05-09 54 views
2

我試圖(通過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

回答

6

嘗試更換:

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

0

我不太清楚你

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

0

存儲過程的輸入參數和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"); 

    }