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