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.
Este ejemplo tomamos la tabla Categories de la DB Northwind
Cuando creas un dataset tipado lo haces algo asi:
Y queremos agregar una nueva Query
Y luego la opción seleccionada por todos es
Asignamos un nombre a la función
La función se crea correctamente
Si la probamos da esto
Nos devuelve correctamente el valor
Pero si vamos a un ejemplo sencillo
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
Y funciona… devuelve el valor del Id insertado
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
Y la parte que nos interesa
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.
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??
Podemos visualizar esta colección aquí
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
Haciendo uso de las clases parciales, cree un archivo Categorias.Metodos.vb que contiene el código anterior
Probando en el código anterior
Probando
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
Enlaces
- @@IDENTITY
- SCOPE_IDENTITY
- SqlCommand.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. - SqlCommand.ExecuteNonQuery
Ejecuta una instrucción de Transact-SQL en la conexión y devuelve el número de filas afectadas. - How to retrieve stored procedure return values from TableAdapter
Muy Buena Explicacion
MCP.NET,MCTS.NET WEB
Excelente explicacion gracias por tu aporte.
si esta bien
Muy buena tu explicacion me sirvio bastante. GRACIAS
Excelente!!!!
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.
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???
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