Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Parámetros de retorno de Store Procedure

Estas en el tema de Parámetros de retorno de Store Procedure en el foro de SQL Server en Foros del Web. Hola, estoy aprendiendo a utilizar store procedures para obtener los datos de la DB. Uso SQL Server 2005 y Visual Studio 2005. El problema que ...
  #1 (permalink)  
Antiguo 05/09/2006, 18:12
Avatar de SeriketZu  
Fecha de Ingreso: septiembre-2006
Ubicación: Mendoza, Argentina
Mensajes: 78
Antigüedad: 17 años, 7 meses
Puntos: 0
Parámetros de retorno de Store Procedure

Hola, estoy aprendiendo a utilizar store procedures para obtener los datos de la DB. Uso SQL Server 2005 y Visual Studio 2005.
El problema que se me ha presentado es que, luego de crear la store procedure y el código correspondiente para llamarla y obtener los datos, ejecuto el programa para probar eso y me devuleve un error en tiempo de ejecución porque luego de ejecutar la store procedure no obtengo resultados.

Este es el store procedure:
Código:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[Rubros_consultarRubro] 
	@Nombre nchar(30),	
	@ID smallint =1 Output,
	@Descripción nchar(255) ='' Output,
	@Artículos smallint =1 Output
AS
BEGIN
	SET NOCOUNT ON;

  Select @ID=ID, @Descripción=Descripción From Rubros Where Nombre=@Nombre
	Select @Artículos=Count(*) From Artículos Where IDRubro=@ID

END
Este es el código en Visual Basic 2005:
Código:
Public Function consultarRubro(ByVal nombre As String) As Rubro
		Dim cnn As SqlConnection
		cnn = getConnection()
		Dim cmd As New SqlCommand("Rubros_consultarRubro", cnn)
		cmd.CommandType = CommandType.StoredProcedure
		cmd.Parameters.Add("@ID", SqlDbType.SmallInt)
		cmd.Parameters.Add("@Nombre", SqlDbType.NChar, 30)
		cmd.Parameters.Add("@Descripción", SqlDbType.NChar, 255)
		cmd.Parameters.Add("@Artículos", SqlDbType.SmallInt)
		cmd.Parameters("@ID").Direction = ParameterDirection.Output
		'cmd.Parameters("@Nombre").Direction = ParameterDirection.InputOutput
		cmd.Parameters("@Descripción").Direction = ParameterDirection.Output
		cmd.Parameters("@Artículos").Direction = ParameterDirection.Output
		cmd.Parameters("@Nombre").Value = Trim(nombre)
		Dim dr As SqlDataReader
		Dim rub As New Rubro()
		cnn.Open()
		dr = cmd.ExecuteReader()
		dr.Read()
		rub.ID = dr("ID")
		rub.Nombre = Trim(nombre)
		'rub.Nombre = Trim(dr("Nombre"))
		rub.Descripción = Trim(dr("Descripción"))
		rub.Artículos = dr("Artículos")
		'rub.Artículos = cmd.ExecuteScalar()
		cnn.Close()
		Return rub
	End Function
Yo pienso que el problema está en el código del store procedure, ya que ejecuto el mismo desde Sql Server y me da como resultado de retorno un entero.


Código del Store Procedure:
img442.imageshack.us/img442/7208/dibujo1ap5.jpg

Código del programa:
img152.imageshack.us/img152/9363/dibujo2xy5.jpg

Y esto, es algo que me desconcierta, en Sql Server todos los procedimientos que creo al verlos en la vista de árbol me dice que tiene un tipo int de retorno y no sé cómo cambiar eso.
img152.imageshack.us/img152/5683/dibujo0jx5.jpg

Esta es una captura de la ejecución del Store Procedure en Sql Server 2005:
img113.imageshack.us/img113/1923/dibujouu7.png


Creo que tal vez me falta una palabra clave dentro del store procedure que cambie el int que retorna por los datos que yo necesito devolver.

Espero que alguien pueda ayudarme, Gracias!

Última edición por SeriketZu; 05/09/2006 a las 23:14
  #2 (permalink)  
Antiguo 05/09/2006, 19:20
foo
 
Fecha de Ingreso: febrero-2006
Mensajes: 278
Antigüedad: 18 años, 2 meses
Puntos: 0
tu problema no esta en el procedimiento almacenado, está en el codigo c# que muestras... anda al foro de .net para ver que te sugieren
  #3 (permalink)  
Antiguo 05/09/2006, 20:35
Avatar de SeriketZu  
Fecha de Ingreso: septiembre-2006
Ubicación: Mendoza, Argentina
Mensajes: 78
Antigüedad: 17 años, 7 meses
Puntos: 0
Cita:
Iniciado por foo Ver Mensaje
tu problema no esta en el procedimiento almacenado, está en el codigo c# que muestras... anda al foro de .net para ver que te sugieren
El problema no creo que esté en el código, siempre uso la misma forma para conectarme a bases de datos con este código y no he tenido problemas. Lo que pasa es que es la primera vez que utilizo store procedures.
El código, como dice en mi post anterior, es en Visual Basic 2005 no en C#.
Pero sigo convencido en que el problema está en el store procedure porque es el que no devuelve los datos necesarios.
  #4 (permalink)  
Antiguo 05/09/2006, 21:05
foo
 
Fecha de Ingreso: febrero-2006
Mensajes: 278
Antigüedad: 18 años, 2 meses
Puntos: 0
Cita:
Iniciado por SeriketZu Ver Mensaje
El problema no creo que esté en el código, siempre uso la misma forma para conectarme a bases de datos con este código y no he tenido problemas. Lo que pasa es que es la primera vez que utilizo store procedures.
una forma es "conectarte" a la base de datos y otra muy diferente es hacer bien las cosas...
Cita:
El código, como dice en mi post anterior, es en Visual Basic 2005 no en C#.
jeje, no me había dado cuenta que había puesto c#
Cita:
Pero sigo convencido en que el problema está en el store procedure porque es el que no devuelve los datos necesarios.
no tengo idea si tu procedimiento hace lo que deberia (a simple vista creo que NO hay ningun problema), porque no tengo los datos ni el tiempo para probarlo.

si mis conocimientos en .net no me fallan, esto deberia mandar un error:

rub.Artículos = cmd.ExecuteScalar()
cnn.Close()

ya que existe un datareader que esta usando la conexion, por otro lado, si tu procedimiento devuelve multiples conjuntos de datos solo basta ejecutar el metodo NextResult para pasar de un conjunto a otro...
  #5 (permalink)  
Antiguo 05/09/2006, 23:18
Avatar de SeriketZu  
Fecha de Ingreso: septiembre-2006
Ubicación: Mendoza, Argentina
Mensajes: 78
Antigüedad: 17 años, 7 meses
Puntos: 0
:D no había visto que había olvidado comentar esa línea, ya edité el post
la línea rub.Artículos = cmd.ExecuteScalar() la utilicé para probar el método antes de hacer el store procedure, luego la reemplazé por rub.Artículos = dr("Artículos")
El error lo da en rub.ID = dr("ID") diciendo que no se puede asignar un valor porque el datareader está vacío.
No uso NextResult porque esta consulta me debe devolver varios campos pero en un sólo registro, por lo que con un Read() antes de las asignaciones basta.
Te agradezco mucho la ayuda.
  #6 (permalink)  
Antiguo 06/09/2006, 11:54
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
el problema es que esta buscando Id, Descripcion y Articulos en un resultSet retornado, pero este no contiene nada ya que el stored no regresa ningun resultset... todo esta en los parametros de salida.

Por lo que NO requieres ningun Reader.

Ejecuta el comando con un Escalar, obten Id, Descripcion y Articulos desde los valores de los parametros de salida del comando y listo

  #7 (permalink)  
Antiguo 06/09/2006, 12:51
Avatar de SeriketZu  
Fecha de Ingreso: septiembre-2006
Ubicación: Mendoza, Argentina
Mensajes: 78
Antigüedad: 17 años, 7 meses
Puntos: 0
Ahh ahora entiendo el mecanismo, muchas gracias!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:24.