|
Si deseas hacer un intercambio de links con DotNetcr, escríbenos aquí
|
 |
Recibe las actualizaciones vía RSS
|
|
|
Como invocar Procedimientos Almacenados en nuestra clase conexión. |
|
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 |
| Autor : royrojas |
Fecha : 7/17/2006 |
Visitas : 24251 |
Voto : 5.00 |
|
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
|
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.
|
|

carlosbd

jmcsoberano

FabricioLeon

RyKyA

lokito.tlv

adelys Yanet
PER |
233 |
MEX |
226 |
CRI |
180 |
COL |
113 |
ESP |
97 |
ARG |
82 |
|