C# 在C中,如何使用ExecuteOnQuery从存储过程中获取返回值

C# 在C中,如何使用ExecuteOnQuery从存储过程中获取返回值,c#,ado.net,C#,Ado.net,我有以下疑问: create proc [dbo].[DeleteParts] @TransNo nvarchar (6), @fpart nvarchar(25) AS DECLARE @Returns BIT SET @Returns = 1 BEGIN TRY BEGIN TRANSACTION DELETE FROM PARTABLE WHERE TransN

我有以下疑问:

create proc [dbo].[DeleteParts] 
    @TransNo nvarchar (6), @fpart nvarchar(25) 
AS 
    DECLARE @Returns BIT 
    SET @Returns = 1 

    BEGIN 
       TRY  
          BEGIN TRANSACTION 

          DELETE FROM PARTABLE 
          WHERE TransNo = @TransNo and fpart = @fpart

          COMMIT 
       END TRY 
       BEGIN CATCH   
           Print 'Delete failed'    
           SET @Returns = 0      
           -- Any Error Occurred during Transaction. Rollback     
           IF @@TRANCOUNT > 0       
               ROLLBACK  -- Roll back 
       END CATCH

       RETURN @Returns
这个编译得非常好

在C语言中,我想执行这个查询并获取返回值

我的代码如下:

using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
   deletecommand.CommandText = "DeleteParts";
   deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
   deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
   deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);

   string ReturnValue = deletecommand.ExecuteNonQuery().ToString();
}
它没有给我任何错误,但它返回的是受影响的行数,我想返回1或0

示例:如果删除操作成功,则返回1;如果删除操作失败,则返回0

如果您对源代码有任何帮助,我们将不胜感激

谢谢


Pradeep

我看不出您正在返回值。请添加Return语句以返回存储过程中的任何值。

您需要一个方向设置为ParameterDirection.ReturnValue的参数

比如:

SqlParameter returnParameter = deleteCommand.Parameters.Add("RetVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
...
deleteCommand.ExecuteNonQuery();
...
int returnValue = (int) returnParameter.Value;
存储过程当然需要返回此返回值:

create proc [dbo].[DeleteParts]      
    @TransNo nvarchar (6),   
    @fpart nvarchar(25)  
AS      
DECLARE @Returns BIT      
SET @Returns = 1     
...
RETURN @Returns

ExecuteOnQuery返回无法设置的@@ROWCOUNT。因此,实际上您不能使用它返回值。

通常结果作为行返回,就像普通的select查询一样。您可以使用读取器或适配器获取它。

ExecuteOnQuery将返回受影响的行数,但不会返回数据,这就是为什么它是非查询。所以它不会带任何东西回来

这可能有助于阅读:


您需要使用另一种机制来获取数据-使用输出参数的ExecuteReader如何?

您必须在存储过程中指定输出类型,如下所示

@IDout                  [int] output
然后添加此参数

SPParamReturnCollection sp = new SPParamReturnCollection();
        sp.Add(new SPParams { Name = "IDout", ParamDirection = ParameterDirection.Output, Type = SqlDbType.Int });

将变量命名为@Returns不会神奇地返回其值,您必须实际返回该值

不能返回位值,返回值始终为整数。如果您想发回位值,则必须使用输出参数

将return语句添加到过程中:

create proc [dbo].[DeleteParts] 
  @TransNo nvarchar (6), @fpart nvarchar(25) 
AS 
  DECLARE @Returns INT
  SET @Returns = 1 

  BEGIN 
    TRY  
      BEGIN TRANSACTION 

      DELETE FROM PARTABLE 
      WHERE TransNo = @TransNo and fpart = @fpart

      COMMIT 
    END TRY 
    BEGIN CATCH   
       Print 'Delete failed'    
       SET @Returns = 0      
       -- Any Error Occurred during Transaction. Rollback     
       IF @@TRANCOUNT > 0       
           ROLLBACK
    END CATCH

RETURN @Returns
添加一个方向为ReturnValue的参数以接收返回值:

int returnValue;
using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
   deletecommand.CommandText = "DeleteParts";
   deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
   deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
   deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);
   var returnParameter = deletecommand.Parameters.Add("@ret", SqlDbType.Int);
   returnParameter.Direction = ParameterDirection.ReturnValue;

   deletecommand.ExecuteNonQuery();
   returnValue = (int)returnParameter.Value;
}

正如RemoteSojourner所指出的;您没有返回任何内容如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!不要使用报价机制,那只会弄乱你的代码!!这是错过了从该程序,现在它是补充,没有什么不同于乔的post@Pradeep当前位置是的,Joe的帖子中的所有内容都在这个帖子中,但这并不意味着这个帖子中的所有内容都在Joe的帖子中。
int returnValue;
using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
   deletecommand.CommandText = "DeleteParts";
   deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
   deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
   deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);
   var returnParameter = deletecommand.Parameters.Add("@ret", SqlDbType.Int);
   returnParameter.Direction = ParameterDirection.ReturnValue;

   deletecommand.ExecuteNonQuery();
   returnValue = (int)returnParameter.Value;
}