2010-11-24 106 views
1

我想如下检索存储过程在SQL Server 2005中的返回值:在C#中的存储过程的返回值返回错误

 OleDbCommand comm = new OleDbCommand(process_name, connection); 
     comm.CommandType = CommandType.StoredProcedure; 

     for (int i = 0; i < process_parameters.Length; i++) 
      comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value); 

     //Add output param 
     comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

     comm.ExecuteNonQuery(); 

当的ExecuteNonQuery()被调用,但是,我找回OleDbException说:“过程或函数myStoredProcedure指定的参数太多。”我的存储过程开始,如下所示:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT] 
(
      @Param1  char (64), 
      @Param2  char (128), 
      @Param3  char (64), 
) 
AS 
BEGIN 
    Declare  @TestID   int 

而且具有以下结尾:

RETURN @TestID 
END 

这是否将返回值声明,而不是作为一个参数传递的事实,有什么关系用它?如果是这样,我怎么能得到存储过程开始后声明的参数的返回值?谢谢你的帮助。

更新: 我试过到目前为止建议的修改,添加以下行:

  OleDbCommand comm = new OleDbCommand(process_name, connection); 
      comm.CommandType = CommandType.StoredProcedure; 

      for (int i = 0; i < process_parameters.Length; i++) 
       comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value); 

      var testID = (int)comm.ExecuteScalar(); 

现在,当ExecuteScalar()被执行,我得到一个的NullReferenceException对象引用不设置到对象实例

注:我也尝试将其设置为一个整数int testID = (int)comm.ExecuteScalar();,我仍然得到相同的错误。

回答

0

好吧,我能得到它的正常工作。我的问题是,我忽略了将任何参数声明为OUTPUT,我添加了一个额外的变量并将其设置为输出变量并使存储过程返回该变量。字后,我刚检查了输出参数,调用存储过程,从我的C#代码后,下面显示的变化:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT] 
(
      @Param1  char (64), 
      @Param2  char (128), 
      @Param3  char (64), 
      @ReturnValue int OUTPUT 
) 
AS 
BEGIN 
    Declare  @TestID   int 

,并在年底做一个简单的变化:

SET @ReturnValue = @TestID 
    RETURN @ReturnValue 
END 

最后,回到我的代码:

 OleDbCommand comm = new OleDbCommand(process_name, connection); 
     comm.CommandType = CommandType.StoredProcedure; 

    for (int i = 0; i < process_parameters.Length; i++) 
     comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value); 

     //Add output param 
     comm.Parameters.Add("@ReturnValue", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

     comm.ExecuteNonQuery(); 
     Console.WriteLine("Stored Procedure returned a value of "+ comm.Parameters["@ReturnValue"].Value); //Success 

谢谢大家的建议。欢迎任何替代品或进一步的见解。

5

变化

comm.ExecuteNonQuery(); 

int returnValue = (int) comm.ExecuteScalar(); 

,并删除:

comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 
0

我想的ExecuteNonQuery()不会从SQL返回任何东西.....我错过这里有什么?

+0

如果存在实际上是一个OUTPUT参数在proc定义中,那么他可以使用ExecuteNonQuery并只读取新的参数值。但是,OP有点混乱 – NotMe 2010-11-24 23:10:46

0

删除这些:

//Add output param 
     comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

     comm.ExecuteNonQuery(); 

,并用这个来代替:var testID = (int) comm.ExecuteScalar();

0

针对接受的答案...

因为你设置DirectionReturnValue这里的参数的:

comm.Parameters.Add("@ReturnValue", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

你不要在你的存储过程需要一个OUTPUT参数都没有。在结束

RETURN @TestID 
END 

,它仍然会工作完全像现在一样:你可以将其改回:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT] 
(
     @Param1  char (64), 
     @Param2  char (128), 
     @Param3  char (64), 
) 
AS 
BEGIN 
    Declare  @TestID   int 

带。

这是纯属巧合你用C ReturnValueParameter#负有相同的名称OUTPUT参数。对于OUTPUT参数,有一个单独的参数Direction

0

我有同样的问题,问题是,你必须声明返回参数第一(之前的输入和输出的),这样一来它的工作原理:

OleDbCommand comm = new OleDbCommand(process_name, connection); 
comm.CommandType = CommandType.StoredProcedure; 

//Add the return param first 
comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue; 

for (int i = 0; i < process_parameters.Length; i++) 
    comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value); 

comm.ExecuteNonQuery(); 
Object return_value = comm.Parameters["@TestID"].Value;