TableAdapter: Recuperar RETURN VALUE desde el procedimiento almacenado

Un amigo me comenta que no puede recuperar los valores de retorno para un procedimiento almacenado, utilizando Dataset tipados.

Así que en vez de escribir un email personalizado, arme algo que nos quede por aquí…

La idea es recuperar por ejemplo el SCOPE_IDENTITY como RETURN VALUE

NOTA: Primeramente me comentaba sobre @@IDENTITY, pero SCOPE_IDENTITY devuelve el último valor de identidad insertado en una columna de identidad en el mismo ámbito. Un ámbito es un módulo: un procedimiento almacenado, desencadenador, función o lote. Por tanto, dos instrucciones están en el mismo ámbito si se encuentran en el mismo procedimiento almacenado, función o lote.

 

image 

Este ejemplo tomamos la tabla Categories de la DB Northwind

Cuando creas un dataset tipado lo haces algo asi:

clip_image004

Y queremos agregar una nueva Query

clip_image006

clip_image008

clip_image010

Y luego la opción seleccionada por todos es

clip_image012

Asignamos un nombre a la función

clip_image014

La función se crea correctamente

clip_image016

Si la probamos da esto

clip_image018

Nos devuelve correctamente el valor

clip_image020

Pero si vamos a un ejemplo sencillo

clip_image022

Vemos que el devuelve un tipo

           System.Nullable(Of Integer)

Cuando probamos no nos da los resultados deseados

 

Solución 1: Agregar SELECT

Para ir a la solucion porque se comporta asi, podremos solucionarlo primeramente agregando un SELECT al final de nuestro procedimiento con la salida deseada.
Esto funciona, y nos devuelve como return de la funcion

En este caso particular la salida es convertida a INT para poder utilizar el mismo código de arriba
image

Y funciona… devuelve el valor del Id insertado

image

Pero esto por que funciona?

Si investigamos un poco el código que genera .NET en la función InserEjemplo que mapea nuestro procedimiento almacenado

image

image

image

Y la parte que nos interesa

image

Utiliza un ExecuteScalar:
(…)
     Ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de resultados devuelto por la consulta. Las demás columnas o filas no se tienen en cuenta.
     Valor devuelto
     La primera columna de la primera fila del conjunto de resultados, o una referencia nula si el conjunto de resultados está vacío.
(…)

Por esta razón no tenemos el retorno que necesitamos para nuestro SP original

Tampoco podemos seleccionar el metodo ExecuteNonQuery, porque devuelve el número de filas afectadas.

image

Si volvemos al código generado cuando inicializa  la colección de comandos y vemos el único que tenemos  que corresponde a la funcion InsertEjemplo podremos ver algo como @RETURN_VALUE??

image

Podemos visualizar esta colección aquí

image

image

 

 

Solución 2: Crear método de lectura para RETURN VALUE

Gracias al Equipo de Datos de VS (VS Data Team), viene la ayuda

Agregar un método GetReturnValue para poder leer el valor del parámetro @RETURN_VALUE que esta en la posicion 0. Recibe el indice del comando

image

Haciendo uso de las clases parciales, cree un archivo Categorias.Metodos.vb que contiene el código anterior

image

 

Probando en el código anterior

image

Probando

image

Tendríamos que hacer un casteo o conversión a Int32, ya que como vimos devuelve un Objeto

 

Porque 1 en GetReturnValue(1)?
En el diseñador miramos la inicialización en el metodo InitCommandCollection donde

image

 

 

Enlaces

8 comentarios en “TableAdapter: Recuperar RETURN VALUE desde el procedimiento almacenado”

  1. Y que si quiero obtener el valor pero de los comandos insert, update , me he roto la cabeza siguiendo esta lógica y no he podido resolver.
    Ayuda por favor.

  2. A mi no me ofrece [base de datos]TableAdapters. cualquier cosa, todo lo he hecho con ASPNETDBDataSetTableAdapters

    Puedes hacer este ejemplo con la bd ASPNETDB, sp aspnet_SchemaVersions??? porfis???

    que me falta configurar para que me muestre solo la opciòn tableadapters???

  3. hola amigos yo utilizo el asistente, el problema mio es el siguiente, yo solicito un nuevo registro, ok, pero cuando le doy cancelar al nuevo registro, ya me ha sumado +1 la clave, esto no es el problema, lo q pasa es q si la clave es digamos 10 la identidad me genero 11,y si le doy cancelar, y luego nuevo registro me genera 12, aunque no exista en la clave 11 asi sucesivamente, me podrian ayudar? he pensado en algo asi como un reject change pero eso del sqldataadapter, y estoy con table adapter y sqlserver 2005. email:otoniel_amigo1@hotmail.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *