DotNetcr.com
Si deseas hacer un intercambio de links con DotNetcr, escríbenos aquí
Recibe las actualizaciones vía RSS
Te invitamos a unirte en nuestras redes
   http://www.facebook.com/DotNetcr
   http://www.twitter.com/dotnetcr

Como invocar Procedimientos Almacenados en nuestra clase conexión.

Por royrojas | 7/17/2006 | Visitas 31,790 | Voto 5.00
En este ejemplo vamos continuar con el desarrollo de la Clase Conexión, solo que ahora le vamos a agregar la clase StoredProcedure y la clase StoredProcedureParameter, para poder ejecutar procedimientos almacenados directamente desde nuestra aplicación
Categorías : VB.NET, ASP.NET, SQL Server
Descargar ejemplo ConexionDB_02.zip

En esta ocasión vamos a continuar la clase conexión desarrollada unos artículos atrás, y ahora vamos a agregarle la opción de poder invocar procedimientos almacenados con múltiples parámetros de distintos tipos de datos, de una forma muy sencilla y basados en los estándares altamente recomendados.

El primer ejemplo de esta Clase Conexion solo permite ejecutar querys simples.

Ahora la gran diferencia es que vamos a agregar dos clases extras, clase StoredProcedure y StoredProcedureParameter.

La clase StoredProcedure tiene dos variables, mNombreProcedimiento como un String y mParametros como una colección de datos, con base a estas variables privadas tenemos sus propias Propiedades Públicas llamadas Nombre y Parametros.

Public Class StoredProcedure

#Region " Variables "
Private mNombreProcedimiento As String
Private mParametros As Collection
#End Region

#Region " Propiedades "
Public Property Nombre() As String
Get
Return mNombreProcedimiento
End Get
Set(ByVal Value As String)
mNombreProcedimiento = Value
End Set
End Property

Public Property Parametros() As Collection
Get
Return mParametros
End Get
Set(ByVal Value As Collection)
mParametros = Value
End Set
End Property
#End Region

.
.
.


Un punto importante de esta clase es su constructor, la cual inicializa las variables simples y la colección para los datos, y sin la cual no podríamos invocar los siguientes procedimientos y funciones.

#Region " Constructor "

'Solo recibe el nombre del procedimiento e inicializa la colección.
Public Sub New(ByVal nNombre As String)
Try
Nombre = nNombre
Parametros = New Collection
Catch ex As Exception
Throw ex
End Try
End Sub

#End Region


Ahora para poder utilizar esta clase tenemos el procedimiento AgregarParametro que recibe el nombre de la Variable y el Valor de esta variable. Algo con lo que hay que tener cuidado es que la variable se debe llamar igual a como esta declarada en el procedimiento y no hay que enviarle el @ ya que se agrega automáticamente en el procedimiento.

'Agrega los parametros del procedimiento y su respectivo valor.
Public Sub AgregarParametro(ByVal pVariable As String, ByVal pValor As Object)
Try
Dim iParametro As New StoredProcedureParameter("@" & pVariable, pValor)
Me.Parametros.Add(iParametro)
Catch ex As Exception
Throw ex
End Try
End Sub


Como podemos ver, al nombre de la variable se le agrega el @ necesario para que sea interpretado por el procedimiento almacenado, y el valor el cual es de un tipo Objeto, más adelante podremos ver como lo lee el sistema. Preferiblemente es que se le envien las variables en el mismo orden en que se reciben en el Procedimiento Almacenado.

Ahora para ejecutar el procedimiento con sus respectiva variables debemos invocar la función EjecutarProcedimiento que nos retorna un dataset.

'Ejecuta el procedimiento almacenado.
Public Function EjecutarProcedimiento() As DataSet
Try
Dim Conn As New Conexion
Dim sqlCmd As New SqlCommand(Me.Nombre, Conn.SQLConn)
sqlCmd.CommandType = CommandType.StoredProcedure

Dim mParametro As StoredProcedureParameter

'Agrega las variables al procedimiento almacenado
For Each mParametro In Me.Parametros
Dim pParam As New SqlParameter(mParametro.Variable, mParametro.GetTypeProperty)
pParam.Direction = ParameterDirection.Input
pParam.Value = mParametro.Valor
sqlCmd.Parameters.Add(pParam)
Next

'SqlAdapter utiliza el SqlCommand para llenar el Dataset
Dim sda As New SqlDataAdapter(sqlCmd)

'Se llena el dataset
Dim ds As New DataSet
sda.Fill(ds)

Conn.SQLConn.Close()
Return ds
Catch ex As Exception
Throw ex
End Try
End Function



En esta función declaramos una variable de tipo StoredProcedureParameter, la cual veremos más adelante.

En esta función EjecutarProcedimiento declaramos una variable SqlCommand y le indicamos que es de tipo StoredProcedure, ( sqlCmd.CommandType = CommandType.StoredProcedure ), con esto le indicamos al SqlDataAdapter la forma en que se ejecuta la consulta.

La última clase de este ejemplo, StoredProcedureParameter es la que administra las posibles variables del procedimiento, igualmente el procedimiento podría no recibir variables y la colección estar limpia.

Public Class StoredProcedureParameter

Private mVariable As String
Private mValor As Object

'Nombre de la variable, debe ser igual a la declarada en el procedimiento almacenado
Public Property Variable() As String
Get
Return mVariable
End Get
Set(ByVal Value As String)
mVariable = Value
End Set
End Property

'Valor de la variable, puede ser de cualquier tipo de dato. preferible que
'coincida con las variables declaradas en GetTypeProperty
Public Property Valor()
Get
Return mValor
End Get
Set(ByVal Value)
mValor = Value
End Set
End Property

'Se definen los posibles tipos de datos que se le van a enviar al procedimiento almacenado
'Esta lista podria aumentar conforme se usen otro tipo de variable.
Public ReadOnly Property GetTypeProperty() As SqlDbType
Get
If mValor.GetType.FullName = "System.String" Then
Return SqlDbType.VarChar
ElseIf mValor.GetType.FullName = "System.Int16" Then
Return SqlDbType.Int
ElseIf mValor.GetType.FullName = "System.Int32" Then
Return SqlDbType.Int
ElseIf mValor.GetType.FullName = "System.Int64" Then
Return SqlDbType.Int
ElseIf mValor.GetType.FullName = "System.Decimal" Then
Return SqlDbType.Decimal
ElseIf mValor.GetType.FullName = "System.Double" Then
Return SqlDbType.BigInt
ElseIf mValor.GetType.FullName = "System.DateTime" Then
Return SqlDbType.DateTime
ElseIf mValor.GetType.FullName = "System.Byte" Then
Return SqlDbType.Image
End If
End Get
End Property

'Procedimiento de creacion de la variable.
Public Sub New(ByVal pVariable As String, ByVal pValor As Object)
Try
Me.Variable = pVariable
Me.Valor = pValor
Catch ex As Exception
Throw New Exception("Error en la creacion del Parametro" & vbCrLf & ex.Message)
End Try
End Sub

End Class


El constructor recibe las dos variables del parametro, el nombre de la variable y el valor.

La propiedad GetTypeProperty es muy importante en esta clase, ya que le indica al procedimiento de que tipo de datos es la variable que se le está enviando.

Ahora para poder utilizar estas clases en un sistema de una forma muy sencilla deberíamos de invocarlas así:

Dim ds As New DataSet

Dim sp As New StoredProcedure("SP_Traer_Datos")
sp.AgregarParametro("nombre_variable", valor_variable)
sp.AgregarParametro("nombre_variable_2", valor_variable_2)

ds = sp.EjecutarProcedimiento()


Se pueden agregar tantas variable como sean necesarias no hay límite, esto en el caso de que se llame a un procedimiento almacenado, pero si lo que se ejecuta es una consulta directa (no recomendada para aplicaciones n capas), se debe hacer así:

Dim ds As New DataSet
Dim strQry As String

strQry = "SELECT * FROM TABLA"
ds = con.ConsultaBD(strQry)

Me.dgDatos.DataSource = ds.Tables(0)


De esta forma podemos invocar procedimientos almacenados en nuestras aplicaciones y no tener que lidiar con estar desarrollando código distinto cada vez que lo necesitemos.

Descargar ejemplo ConexionDB_02.zip
Area de Comentarios
Por Anónimo - Fecha: 2006/07/31 02:43 AM
muchas gracias por el ejemplo, demaciado bueno.
para implementarlo le hice pocos cambios y me quedo muy bien dentro de mi sistema.
muy sencillo de utilizar.
gracias :)
Por elche - Fecha: 2006/07/31 02:44 AM
roy, muy buen articulo. sigue así.
saludos desde Buenos Aires
Por Anónimo - Fecha: 2006/08/02 06:26 PM
Saludos y felicitaciones por el artículo.

Pero que pasaría si uno de mi parámetros fuera un password (tipo de dato binario , tamaño 16)?

Cómo puedo agregarle al método GetTypeProperty que reconozca si es binario si la clase System no contempla el binary?
Por Anónimo - Fecha: 2006/08/03 03:22 PM
por que lo haces binario,
el campo del password en tu form que es lo que retorna un string?, lo mas seguro es que lo estes encriptando, y esta encriptado que te retorna otro string supongo? o no es asi.
que tipo de dato le estas enviando a la base de datos es un string que quieres transformarlo a binary.?
Por Anónimo - Fecha: 2006/08/08 03:41 PM
SI, es un password encriptado en MD5, por lo que me retorna un byte[] de 16 bits. Quería saber si tengo que hacer alguna conversión adicional para guardarlo en la BD, porque, a pesar de que el campo password está en binary 16, no me lo guarda :(

Y otra cosa, tengo problemas con la clase StoredProcedure pues al momento de crear el new collection de parámetros me da un error en el Count "cannot obtain the value" y al final, a pesar de reconocer las variables y el procedimiento, no termina de guardarlo y el dataset no se me carga :(
Por Anónimo - Fecha: 2006/08/11 04:34 PM
hasta donde yo tengo entendido, un password MD5 se puede guardar como un varchar o string o text, es simple texto encriptado.
Por Anónimo - Fecha: 2006/09/16 04:15 PM
ssdfsdf
Por Anónimo - Fecha: 2006/10/17 09:24 AM
simplemente exelente
Por Anónimo - Fecha: 2006/10/23 06:38 AM
ñiiiii
Por Anónimo - Fecha: 2006/11/07 07:47 AM
excelente
Por Anónimo - Fecha: 2006/12/19 07:40 AM
Me aparece el error 40....
Por Anónimo - Fecha: 2007/01/24 11:05 AM
Excelente el Ejemplo, estoy intentando usarlo y me aparece el siguiente error:
Fill: SelectCommand.Connection property has not been initialized.
at ClasesVBNET.StoredProcedure.EjecutarProcedimiento()

Muchas Gracias.-
Por Anónimo - Fecha: 2007/02/05 01:59 PM
hola estoy tratando de implementar este codigo en mi sistema; esta muy bueno muchas gracias mucha suerte.... dios te bendiga
Por Anónimo - Fecha: 2007/04/21 03:02 PM
Buenas saben quien me podria brindar un manual de C# con Procedimientos almacenados en Sql Server 2005 para como para practicar y aprender mas de este hermozo lenguaje.

Gracias por todo y recuerden "Es de Inteligentes compartir!!!!!"
Por Anónimo - Fecha: 2007/08/21 08:47 AM
Y como lo hago para retornar parametro de output y el return status
Por royrojas - Fecha: 2007/08/26 12:42 PM
y aqui hay un ejemplo de la conexion con una aplicacion ASP.NET 2005
esta aplicacion ya implementa el return value en la clase conexion.

http://www.dotnetcr.com/Libreria.aspx?art=108&tag=Aplicacion-Web-To-Do-List-o-Task-List-utilizando-ASPNET-2005-y-Ajax
Por Anónimo - Fecha: 2007/09/17 12:22 PM
Muy buen articulo. Estuve tratando de hacer algo parecido y gracias a este ejemplo espero poder hacerlo. Aunque tengo una duda. Que sucede si alguno de los parametros que le paso al SP es nullo y como se solucionaria ese problema? Teniendo en cuanta que el valor null se lo paso por còdigo. Espero ser claro.
Por Anónimo - Fecha: 2007/09/22 04:37 PM
lo vi a vuelo de pajaro y creo que es lo que necesito, lo estudio e implemento de hay vemos ok, desde ya agradecido.
Por Anónimo - Fecha: 2007/09/25 12:14 PM
Una duda, si trabajo en sql con un campo de tipo Text, cual seria su equivalente en el metodo GetTypeProperty, lo mismo para un campo de tipo money. Teniendo en cuanta que estos dos valores no estan contemplados en .Net (o eso creo).
Por Anónimo - Fecha: 2007/09/25 12:14 PM
Una duda, si trabajo en sql con un campo de tipo Text, cual seria su equivalente en el metodo GetTypeProperty, lo mismo para un campo de tipo money. Teniendo en cuanta que estos dos valores no estan contemplados en .Net (o eso creo).
Por Anónimo - Fecha: 2008/03/27 08:13 PM
Porqué al convertir tu código de visual basic:
#Region " Variables "
Private mNombreProcedimiento As String
Private mParametros As Collection
#End Region

a C#:
#region " Variables "
private string mNombreProcedimiento;
private Collection mParametros;
#endregion
en la línea : private Collection mParametros;
manda el siguiente mensaje: Error 1 No se puede encontrar el tipo o el nombre de espacio de nombres ''Collections'' (¿falta una directiva using o una referencia de ensamblado?)
a qué se debe ?
le daría 5 puntos, porque funciona en vb.net, pero no estoy registrado, pero para c# nomkas no jala
Por Anónimo - Fecha: 2008/04/09 03:33 AM

Te las mandaste compradre, buscaba algo como esto y he quedado anodado,
Felicidades por tu conocimiento.
Por Anónimo - Fecha: 2008/11/14 11:05 AM
muchas gracias por tu aporte, esat recontra bueno , espero sigas apoyando con tus buenos aportes, saludos y gracias
Por royrojas - Fecha: 2010/01/25 08:30 AM
para el que pregunto sobre el campo text, ese seria con string. de igual forma esa clase ya la modifique y esa funcion ya no existe, en estos dias voy a estar publicando la neuva version con muchas mejoras.
Por Anónimo - Fecha: 2010/11/29 06:00 PM
simplemente fenomenal
Por Anónimo - Fecha: 2011/02/23 07:07 AM
Si deseas realizar un mini sistema de ventas con C# usando procedimientos almacenados en una base de datos SQL Server 2008 y aplicando el modelo de programacion en capas puedes visitar los siguiente enlaces

http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de.html
http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_22.html

Saludos
Por Anónimo - Fecha: 2011/02/24 06:27 AM
Si desean puede ver un ejemplo de como realizar un mini sistema de ventas con c# y Procedimientos almacenados con reportes en crystal report en los siguientes link Creando la Base de Datos http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de.html Creando la capa de datos http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_22.html Creando la capa de negocios http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_5596.html Creando la capa de presentacion http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_23.html Creando los reportes en crystal report http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_5944.html Saludos
Por Anónimo - Fecha: 2011/02/24 06:28 AM
Si desean puede ver un ejemplo de como realizar un mini sistema de ventas con c# y Procedimientos almacenados con reportes en crystal report en los siguientes link Creando la Base de Datos http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de.html Creando la capa de datos http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_22.html Creando la capa de negocios http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_5596.html Creando la capa de presentacion http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_23.html Creando los reportes en crystal report http://hwongu.blogspot.com/2011/02/c-aplicacion-de-escritorio-sistemas-de_5944.html Saludos
Por Anónimo - Fecha: 2012/09/27 07:03 AM
I'm in the process of deivlopeng a SQL Server Dashboard (using SQL 2008 and SSRS 2008) for all our prod servers (around 22 globally) that needs to show us all sorts of things like CPU (various avg's), disk space, failed jobs, jobs that are long running, blocks/locks, logshipping statuses etc etc. Basically overall health.Where this UCP (and the 2005 reports dashboard) falls short is:a) it's not realtime enough,b) it doesn't give you an overview of all your boxes on 1 page,c) it only shows CPU and disk space counters andd) what about all our 2000 and 2005 instances?? Must they just be left out in the coldWe run high volume stock trading systems where minutes can mean big money and so we need to be able to spot any issues immediately.And on the DAC subject:So it doesn't do assemblies, it doesn't do CLR's and encrypted procs, it doesn't do service broker objects, replication publications, jobs or linked servers so basically it's no different to generating a script of the procs, views, tables, functions and users of a database, which is very very quick and easy from the task menu, then saving the script (or just backing up and restoring the DB).Big fan of new tech, but come on give us something new and useful, not just some shiny bells and whistles for the beginners.
Por Anónimo - Fecha: 2012/09/28 06:36 PM
jNFx9h , [url=http://cigkljhwcguk.com/]cigkljhwcguk[/url], [link=http://fclucrgsdjdo.com/]fclucrgsdjdo[/link], http://mhozfswdekfp.com/
Por Anónimo - Fecha: 2012/09/30 06:35 AM
RKSCTU , [url=http://tqnvqdodxvgo.com/]tqnvqdodxvgo[/url], [link=http://xcvupjmvlonc.com/]xcvupjmvlonc[/link], http://ohhstydnminz.com/
Por Anónimo - Fecha: 2014/10/14 10:25 PM
Because here is a list of multiplayer games is eeecceekkgdb
Por Anónimo - Fecha: 2014/10/15 04:29 PM
Very nice site! [url=http://yieapxo2.com/qoqsxv/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/15 04:29 PM
Very nice site! cheap goods http://yieapxo2.com/qoqsxv/4.html
Por Anónimo - Fecha: 2014/10/15 04:29 PM
Very nice site!
Por Anónimo - Fecha: 2014/10/16 11:03 PM
Very nice site! [url=http://ypxaieo2.com/ooovrvy/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/16 11:07 PM
Very nice site! cheap goods http://ypxaieo2.com/ooovrvy/4.html
Por Anónimo - Fecha: 2014/10/16 11:08 PM
Very nice site!
Por Anónimo - Fecha: 2014/10/18 05:08 AM
Very nice site! [url=http://oixypea2.com/qxqsxsq/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/18 05:08 AM
Very nice site! cheap goods http://oixypea2.com/qxqsxsq/4.html
Por Anónimo - Fecha: 2014/10/18 05:08 AM
Very nice site!
Por Anónimo - Fecha: 2014/10/19 11:28 AM
Very nice site! cheap goods http://opxyiea2.com/yoyaqao/4.html
Por Anónimo - Fecha: 2014/10/19 11:28 AM
Very nice site!
Por Anónimo - Fecha: 2014/10/20 05:50 PM
Very nice site! cheap goods http://oixypea2.com/oxovrvr/4.html
Por Anónimo - Fecha: 2014/10/20 05:50 PM
Very nice site!
Por Anónimo - Fecha: 2014/10/21 11:46 PM
Very nice site! [url=http://yieopxa2.com/yxyaqax/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/21 11:46 PM
Very nice site! cheap goods http://yieopxa2.com/yxyaqax/4.html
Por Anónimo - Fecha: 2014/10/23 06:40 AM
Very nice site! [url=http://aieopxy2.com/osovrvv/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/23 06:40 AM
Very nice site! cheap goods http://aieopxy2.com/osovrvv/4.html
Por Anónimo - Fecha: 2014/10/23 06:40 AM
Very nice site!
Por Anónimo - Fecha: 2014/10/28 04:27 AM
Very nice site! [url=http://opxaiey2.com/oyyaqvy/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/28 04:27 AM
Very nice site! cheap goods http://opxaiey2.com/oyyaqvy/4.html
Por Anónimo - Fecha: 2014/10/28 04:27 AM
Very nice site!
Por Anónimo - Fecha: 2014/10/29 10:36 AM
Very nice site! [url=http://yieapxo2.com/qrovrsq/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/29 10:37 AM
Very nice site! cheap goods http://yieapxo2.com/qrovrsq/4.html
Por Anónimo - Fecha: 2014/10/29 10:37 AM
Very nice site!
Por Anónimo - Fecha: 2014/10/30 04:53 PM
Very nice site! [url=http://opeyixa2.com/rvqsxtx/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/30 04:54 PM
Very nice site! cheap goods http://opeyixa2.com/rvqsxtx/4.html
Por Anónimo - Fecha: 2014/10/30 04:56 PM
Very nice site!
Por Anónimo - Fecha: 2014/10/31 11:11 PM
Very nice site! [url=http://opeyixa2.com/qvovrsa/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/10/31 11:11 PM
Very nice site! cheap goods http://opeyixa2.com/qvovrsa/4.html
Por Anónimo - Fecha: 2014/10/31 11:11 PM
Very nice site!
Por Anónimo - Fecha: 2014/11/02 05:39 AM
Very nice site! [url=http://oixapey2.com/rqsxts/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/11/02 05:39 AM
Very nice site! cheap goods http://oixapey2.com/rqsxts/4.html
Por Anónimo - Fecha: 2014/11/02 05:39 AM
Very nice site!
Por Anónimo - Fecha: 2014/11/03 11:33 AM
Very nice site! [url=http://ypxoiea2.com/ovyaqvv/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/11/03 11:33 AM
Very nice site! cheap goods http://ypxoiea2.com/ovyaqvv/4.html
Por Anónimo - Fecha: 2014/11/03 11:33 AM
Very nice site!
Por Anónimo - Fecha: 2014/11/04 05:37 PM
Very nice site! [url=http://apeoixy2.com/xqqsxt/2.html]cheap goods[/url]
Por Anónimo - Fecha: 2014/11/04 05:38 PM
Very nice site! cheap goods http://apeoixy2.com/xqqsxt/4.html
Por Anónimo - Fecha: 2014/11/04 05:39 PM
Very nice site!
Por Anónimo - Fecha: 2015/06/04 02:17 AM
Exelente trabajo (y)
Por Anónimo - Fecha: 2015/07/18 05:06 AM
Hello Jason, thank you for following my Excel bolg.I know the code works, so here are a few ideas for you to look at. Are you sure • the wokrsheet you are testing this for is Sheet1.• you are working with cells A1, A2, A3, A4, A5, and A6.• each of those 6 cells all have some kind of data in them.• none of those cells are merged with each other or merged with any other cells.Feel free to post back if you are still stuck. It sounds like something minor that you are missing. And trust me, I can relate to how as a newcomer to VBA it is not easy to spot a nunace here and there. We were all beginners at one time, so no worries with asking any kind of question in order to get this to work for you. Post back so I can know how it turns out.
Ingrese su Comentario
Comentario
Para poder votar debe estar registrado en DotNetcr.com
Solo queda registrado el primer voto enviado
Voto


Últimos Recursos
ricardo leppe t
pedrojavier
CALIN
willipinru
richard
ragomez
PER 238
MEX 236
CRI 188
COL 118
ESP 105
ARG 88