2011-02-16 25 views
7

Tengo la siguiente consulta:En C# cómo obtener valor devuelto de procedimiento almacenado utilizando ExecuteNonQuery

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 

Esto compila perfectamente bien.

En C#, deseo ejecutar esta consulta y obtener el valor de retorno.

Mi código es la siguiente:

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(); 
} 

No me da ningún error, pero en vez de eso está regresando número de filas afectadas, quiero volver 1 ó 0.

Ejemplo: Si Eliminar el éxito de la operación luego devuelve 1 y si falla, devuelve 0.

Cualquier ayuda con el código fuente sería apreciada.

Gracias,

Pradeep

+1

Como señala RemoteSojourner; * no * devuelve nada –

+0

Si publica código, XML o muestras de datos, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ('{}') en la barra de herramientas del editor Para formatear y sintaxis, ¡destaquelo! (y ** no ** use el mecanismo "citando" en su lugar - ¡eso solo arruina su código!) –

Respuesta

14

Se necesita un parámetro con Direction conjunto de ParameterDirection.ReturnValue

Algo así como:

SqlParameter returnParameter = deleteCommand.Parameters.Add("RetVal", SqlDbType.Int); 
returnParameter.Direction = ParameterDirection.ReturnValue; 
... 
deleteCommand.ExecuteNonQuery(); 
... 
int returnValue = (int) returnParameter.Value; 

Usted procedimiento almacenado tiene que devolver este valor devuelto por supuesto:

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

no veo que va a devolver el valor. Agregue la declaración de devolución para devolver cualquier valor del proceso almacenado.

+0

se perdió de ese proceso, ahora se agrega – Pradeep

0

ExecuteNonQuery() devuelve el @@ROWCOUNT que no puedes establecer Entonces realmente no puedes usarlo para devolver valores.

0

Normalmente el resultado se devuelve como una fila, como una consulta de selección normal. Puede hacerlo usando un lector o adaptador.

0

debe especificar el tipo de salida en los procedimientos almacenados como esto

@IDout     [int] output 

luego agregar este parámetro

SPParamReturnCollection sp = new SPParamReturnCollection(); 
     sp.Add(new SPParams { Name = "IDout", ParamDirection = ParameterDirection.Output, Type = SqlDbType.Int }); 
0
IF EXISTS(SELECT TransNo FROM [PARTABLE] WHERE TransNo = @TransNo and fpart = @fpart 
     BEGIN      
      DELETE FROM PARTABLE 
         WHERE TransNo = @TransNo and fpart = @fpart 

      SELECT @TransNo AS RETURNVAL 
     END 
     ELSE 
     BEGIN 
      SELECT 0 AS RETURNVAL 
     END 
0

Naming una variable "@Returns" no volver mágicamente su valor, tienes que devolver el valor.

No puede devolver un valor de bit, el valor de retorno es siempre un número entero. Si desea devolver un valor de bit, debería usar un parámetro de salida en su lugar.

Añadir un comunicado return al procedimiento:

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 

añadir un parámetro con la dirección ReturnValue para recibir el valor de retorno:

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; 
} 
+0

Nada es diferente de la publicación de Joe – Pradeep

+0

@Pradeep: Sí , todo en la publicación de Joe también está en esta publicación, pero eso no significa que todo en esta publicación esté en la publicación de Joe. – Guffa

Cuestiones relacionadas