Microsoft Data Access Application Block para .NET(Parte 1)
Consiste de un ensamblado denominado "Microsoft.ApplicationBlocks.Data", el cual contiene toda la funcionalidad necesaria para realizar la mayoría de las funciones de acceso a datos sobre la base de datos Microsoft SQL Server #.
Estas funciones le ayudaran a resolver las siguientes tareas:
- Ejecutar procedimientos almacenados o sentencias SQL, incluyendo parámetros.
- Devolver objetos SqlDataReader, DataSet, XmlReader, o valores únicos (scalar).
Inicialmente diremos que el espacio de nombres Microsoft.Applicationblocks.Data contiene la clase SQLHelper, la cual provee los siguientes métodos:
- ExecuteNonQuery. Este método se utiliza para ejecutar Comandos que no devuelven filas o valores. Es generalmente usado para funciones de ABM con procedimientos almacenados.
- ExecuteReader. Devuelve un objeto SqlDataReader que contiene el resultado del comando de consulta o procedimiento almacenado.
- ExecuteDataset. Devuelve un DataSet que contiene el resultado del comando de consulta o procedimiento almacenado (El dataset es retornado lleno con datos).
- ExecuteScalar. Devuelve un valor único. Este valor es el correspondiente a la primera columna de la primera fila retornada por el comando.
- ExecuteXmlReader. Devuelve un documento en formato XML desde una consulta del tipo “FOR XML"
Cada uno de estos métodos soporta el uso de comandos, procedimientos almacenados y transacciones SQL y la posibilidad de utilizar parametros (de entrada y salida).
Para descargarlos:
http://msdn.microsoft.com/en-us/library/ff648951.aspx
Elijan uno para la versión de su visual studio, para el ejercicio usaremos Enterprise Library 5.0 para Visual Studio 2010. Descargar e instalar.
Para completar este tutorial necesitas entender programación en capas, visita mi entrada del blog referente a ese tema: http://programmerbook.blogspot.com/2013/06/tutorial-programacion-en-capas-net.html
A diferencia de la otra entrada del blog, en este caso no usarémos Entity Framework ni Linq para acceso a datos, sino las librerías de Microsoft. (Pronto haré una entrada del blog sobre cual tecnología elegir al momento de desarrollar una nueva aplicación)
1. El ejemplo utiliza el siguiente diagrama de Tablas:
1. El ejemplo utiliza el siguiente diagrama de Tablas:
- 1. Data: Acceso a datos
- 2. Entidades: Clases/entidades
- 3. Negocios: Lógcia del negocio
- 4. Winform: Interfaz de usuario
Realizar las referencias entre proyectos de la siguiente manera:
- Data contiene referencias de: Entidades
- Negocios contiene referencias de: Entidades y Data
- Winform contiene referencias de: Entidades y Negocios
Capa Entidades
Definir clases de entidades solo con sus propiedades y constructores. Por ejemplo para el caso de la entidad Vendedor se crea la clase "VendedorInfo.vb", que contiene 2 propiedades y 2 constructores:
De igual forma para las demás entidades ClienteInfo.vb, RutaInfo.vb, TipoVisitaInfo.vb, VisitaInfo.vb la fuente la pondré para descargar al final del tutorial. Cuando terminen de definir las entidades continúan con la siguiente sección:
Public Class VendedorInfo
Public Property IdVendedor As Integer
Public Property Nombres As String
Sub New(idvendedor As Integer, nombres As String)
Me.IdVendedor = idvendedor
Me.Nombres = nombres
End Sub
Sub New()
End Sub
End Class
De igual forma para las demás entidades ClienteInfo.vb, RutaInfo.vb, TipoVisitaInfo.vb, VisitaInfo.vb la fuente la pondré para descargar al final del tutorial. Cuando terminen de definir las entidades continúan con la siguiente sección:
Capa Data
1. En la capa Data, agregar referencia a las siguientes librerias que vienen con el instalador del Enterprise Library 5.0:- Microsoft.Practices.EnterpriseLibrary.Common.dll
- Microsoft.Practices.EnterpriseLibrary.Data.dll
- Microsoft.Practices.Unity.dll
2. Crear una clase "BaseDatos.vb", hacer imports a los siguientes NameSpaces de esas librerias:
- Imports Microsoft.Practices.EnterpriseLibrary.Common
- Imports Microsoft.Practices.EnterpriseLibrary.Data.Sql
3. Crear una propiedad privada "_db" de tipo SqlDatabase. y una propiedad compartida de solo lectura "BD" del mismo tipo, en el Get programar la conexion a la base de datos. La clase debe quedar algo así:
Imports Microsoft.Practices.EnterpriseLibrary.Common
Imports Microsoft.Practices.EnterpriseLibrary.Data.Sql
Public Class BaseDatos
Private Shared _db As SqlDatabase
Public Shared ReadOnly Property BD() As SqlDatabase
Get
If (_db Is Nothing) Then
_db = New SqlDatabase( _
"Server=WILLY8\MSSQLSERVER2012;Database=VisitasDB;Integrated Security=False;User=sa;Password=123456")
End If
Return _db
End Get
End Property
End Class
4. Crear una clase "VendedorData.vb" y agregar los métodos para consultar listado de vendedores, consultar 1 vendedor específico, grabar, modificar, eliminar:
Imports Entidades
Public Class VendedorData
'Muestra como se usa el metodo ExecuteReader,
'puede recibir una sentencia sql o el nombre de un storedprocedure en String
Public Function ConsultarVendedores() As List(Of VendedorInfo)
Dim lista As New List(Of VendedorInfo)
Using dr As IDataReader = BaseDatos.BD.ExecuteReader(CommandType.Text, "Select * from tbVendedor")
While dr.Read
lista.Add(New VendedorInfo(dr.GetInt32(dr.GetOrdinal("IdVendedor")), dr.GetString(dr.GetOrdinal("Nombres"))))
End While
dr.Close()
End Using
Return lista
End Function
'Se pueden usar sentencias Select con where
Public Function ConsultarVendedor(IdVendedor) As VendedorInfo
Dim v As New VendedorInfo
Using dr As IDataReader = BaseDatos.BD.ExecuteReader( _
CommandType.Text, "Select * from tbVendedor where IdVendedor = " + IdVendedor.ToString())
While dr.Read
v.IdVendedor = IdVendedor
v.Nombres = dr.GetString(dr.GetOrdinal("Nombres"))
End While
dr.Close()
End Using
Return v
End Function
'Muestra como se usa el ExecuteNonQuery,
'Recibe como parámetro el nombre del procedure, y un arreglo de objetos
'de los valores para el procedure
Public Sub GrabarVendedor(EsNuevo As Boolean, Vendedor As VendedorInfo)
BaseDatos.BD.ExecuteNonQuery("uspManejaVendedor", _
New Object() {EsNuevo, Vendedor.IdVendedor, Vendedor.Nombres})
End Sub
Public Sub EliminaVendedor(IdVendedor As Integer)
BaseDatos.BD.ExecuteNonQuery("uspEliminaVendedor", _
New Object() {IdVendedor})
End Sub
End Class
De igual manera completar las clases RutaData.vb, ClienteData.vb, TipoVisitaData.vb, VisitaData.vb.
Importante!!
Notese que no se necesita abrir y cerrar conexión, ya que las librerias lo hacen automáticamente por cada instrucción "Execute" es una de las ventajas.


Comentarios
Publicar un comentario