Application Blocks: Data Access .Net
[Acceda a los datos en forma eficiente, prolija y reduzca las líneas de código]

Fecha: 30/Nov/2004 (29/11/2004)
Autor: Hugo Contreras (hlcont@hotmail.com)

 

.

MICROSOFT DATA ACCESS APPLICATION BLOCKS

Primeramente voy a contarles que soy un desarrollador, buscador incansable de herramientas que faciliten mi trabajo, que me permita ahorrar tiempo y que además, agregue calidad al software que desarrollo. Al ingresar en el mundo .Net empecé a explorar en los patrones de “buenas practicas de acceso a datos” y buscando en el sitio de Microsoft me encontré con algo que me pareció una buena idea. Después de ver su contenido y analizarlo en profundidad me pareció tremendamente práctico y decidí incorporarlo a mi set de herramientas de desarrollo. Estoy hablando de “Application Blocks” (algo así como ladrillos para la construcción de aplicaciones) y en este caso, específicamente el “Data Access Application Blocks”.

Este ensamblado provee una forma simple, ordenada y limpia de acceder a los datos del Servidor de base de datos MS SQL Server. Muchos de nosotros, los desarrolladores, pensamos que debemos concentrar nuestro esfuerzo en lo que nuestra aplicación “debe hacer” y no en “como se hace”. Sabemos que perdemos, o mejor dicho “gastamos”, la mayor parte de nuestro tiempo tratando de solucionar el acceso a datos como así también la interfase con el usuario, la cual nos lleva bastante tiempo también, pero “ese” es otro tema que no es parte de este artículo.

Pero bien, justamente estos “Application Blocks” vienen a responder a esa necesidad, y lo hace con un valor agregado, que es que responde a los patrones de buenas prácticas de ADO.NET.

El Microsoft Data Access Application Block para .NET 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 2000.

Estas funciones le ayudaran a resolver las siguientes tareas:

Inicialmente diremos que el espacio de nombres Microsoft.Applicationblocks.Data contiene la clase SQLHelper, la cual provee los siguientes métodos:

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).

En lo que respecta a la denominación de los métodos de la clase SqlHelper, se debe notar que son similares con los métodos descriptos en ADO.NET. Es que, en realidad, se trata de una implementación de ADO.NET, pero a un nivel macro. Afortunadamente de esta forma resulta más fácil de asimilar y entender cada uno de estos métodos al momento de requerir aplicar alguno de ellos.

Si bien cada uno de estos métodos están sobrecargados (“overloaded”) brindando mayores opciones de uso, a los efectos de hacer más simple la lectura y entendimiento de este artículo, veremos los casos de uso más simples.

La idea es que a partir de esta introducción ustedes exploren las distintas variantes de cada uno de estos métodos que encontraran en el apartado “Referencia” de la documentación que acompaña al ensamblado.

Este lo pueden bajar desde:
http://www.microsoft.com/downloads/details.aspx?FamilyId=F63D1F0A-9877-4A7B-88EC-0426B48DF275&displaylang=en

Abora bien. Asumiendo que ya lo bajaron e instalaron en su PC, para comenzar debemos abrir Visual Studio .Net , crear un proyecto nuevo y agregar una referencia a

Microsoft.ApplicationBlocks.Data

Para ello:

Seleccionamos la ventana “Solution Explorer” y en la sección Referencias:

•  Agregar una referencia a Microsoft.ApplicationBlocks.Data.dll.

•  Agregar una línea Imports Imports Microsoft.ApplicationBlocks

 

•  Agregar los nombres de espacio:

imports System.Data
imports System.Data.SqlClient

En el caso que vayan a utilizar XML, entonces agregar:

imports System.Xml

Ahora examinemos los distintos métodos provistos:

ExecuteNonQuery

Se utiliza cuando se requiere:

Ejecutar un procedimiento almacenado o un comando SQL que no devuelve filas ni valores únicos. Se puede utilizar también para consultas que devuelvan resultados a través de parámetros. Ejemplos claros son operaciones de actualización de la base de datos como Insert, Update, Delete o ejecutar una consulta o procedimiento almacenado que devuelva algún parámetro.

A continuación veremos un ejemplo en el que se ejecuta un procedimiento almacenado para obtener el detalle de un producto. El procedimiento se llama “getProductDetails “ al cual se le debe pasar como parámetro de entrada la identificación del producto. Este devolverá tres parámetros que son: el nombre del producto, el precio unitario y la cantidad.

‘ Define los parámetros 
   Dim arParms() As SqlParameter = New SqlParameter(3) {}
' @ProductID Parametro de Entrada
   ' Asigna "1" al parametro ProductID 
   arParms(0) = New SqlParameter("@ProductID", SqlDbType.Int) 
   arParms(0).Value = 1 
' @ProductName Parametro de Salida – Nombre del Producto
   arParms(1) = New SqlParameter("@ProductName", SqlDbType.NVarChar, 40)
   arParms(1).Direction = ParameterDirection.Output 
' @UnitPrice Parametro de Salida – Precio Unitario
   arParms(2) = New SqlParameter("@UnitPrice", SqlDbType.Money)
   arParms(2).Direction = ParameterDirection.Output 
   
' @QtyPerUnit Parametro de Salida - Cantidad
   arParms(3) = New SqlParameter("@QtyPerUnit", SqlDbType.NVarChar, 20)
   arParms(3).Direction = ParameterDirection.Output 
Try 
' Llama al método ExecuteNonQuery de la clase SqlHelper 
' Pasamos como parámetros la cadena de conexión, el tipo de comando, el nombre del procedimiento almacenado y un objeto “array” SqlParameter
SqlHelper.ExecuteNonQuery(txtConnectionString.Text, CommandType.StoredProcedure, "getProductDetails", arParms)
' El resultado se despliega en un “text box” usando los parámetros de salida devueltos por el procedimiento ‘almacenado. 
   
   txtResults.Clear() 
   txtResults.Text = arParms(1).Value & ", " & arParms(2).Value & ", " & arParms(3).Value 
Catch ex As Exception
   ' En caso de error arroja una excepción 
Throw ex 
End Try

Vemos como con una simple línea de código resolvemos la consulta.

 

ExecuteDatareader 

Utilizaremos “Datareader” cuando requerimos recuperar múltiples filas de una base de datos que serán devueltos en un objeto SqlDataReader. Estos datos serán solo de lectura y los podremos utilizar, entre otros, para desplegarlos en una grilla en un formulario.

ExecuteReader soporta data binding y se puede usar como “data source” en controles de datos para controles WebForm como por ejemplo DataList control.

En este ejemplo, se ejecuta un procedimiento almacenado “productos por Categoría” que devuelve una lista de productos dentro de una categoría específica. P asamos como parámetros la cadena de conexión a la base de datos, el nombre del procedimiento almacenado y el valor del parametro categoryID.

Private connectionString As String = "Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=myserver\SQLServer;Connect Timeout=30" 
Dim reader As SqlDataReader = SqlHelper.ExecuteReader(connectionString, "getProductsByCategory", categoryID) 
While dr.Read() 
' Obtiene el valor de la segunda columna del datareader (descripción del producto) y lo pega en un textbox. 
txtResults.Text = txtResults.Text + dr.GetValue(1) + Environment.NewLine 
End While

 

Executedataset

Obviamente como el nombre lo sugiere, este método genera un Dataset y se encarga de "llenarlo con datos".

Vale la pena tener en cuenta que el ADO.NET DataSet es un contenedor de datos que consiste de una o más tablas y opcionalmente las relaciones entre ellas. Es un objeto desconectado, es decir lee la información de la base de datos, se desconecta y se olvida de la fuente de datos. Se trabaja en forma aislada y provee métodos de actualización de la base de datos y que además soporta XML.

En este ejemplo se ejecuta un procedimiento almacenado llamado “custordersorders” que devuelve las ordenes de compra para un cliente especifico. Reciba como parametro la identificación del cliente.

Private constring As String = "Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=myserver\SQLServer;Connect Timeout=30" 
Dim dsorders As DataSet = SqlHelper.ExecuteDataset(constring, CommandType.StoredProcedure, "custordersorders", New SqlParameter("@Customerid", custid)) 
‘ Carga en la grilla el contenido del dataset resultado “dsorders” 
DataGrid1.DataSource = dsorders.Tables("table")  

Data Access Application Block genera un objeto DataSet con nombres por defecto para los objetos DataTable contenidos en el Dataset. Por ejemplo Table, Table1, Table2, y así sucesivamente. 


Executescalar


Se debe utilizar cuando requerimos recuperar un valor único como respuesta una consulta. Notemos que lo que devuelve es un objeto.

En este ejemplo se hace una consulta a la tabla de clientes que cuenta cantidad de clientes por país seleccionado.


Private
constring As String = "Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=myserver\SQLServer;Connect Timeout=30"
'Pasamos como parámetros la cadena de conexion, el tipo de comando texto y la sentencia SQl con el parametro de selección por país. 
TextBox2.Text = SqlHelper.ExecuteScalar(constring, CommandType.Text, "select count(*) from customers where country = @country", New SqlParameter("@Country", TextBox1.Text).ToString) 
Convierte el resultado a una cadena (string) y la asignamos a una caja de texto. 
  
Executexmlreader
Ejecuta un comando o procedimiento almacenado que retorna los datos con formato XML en un objeto XmlReader. 
En este ejemplo utilizaremos un comando SQL “Select” con la cláusula “FOR XML AUTO” que genera el XML.
Private constring As String = "Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=myserver\SQLServer;Connect Timeout=30"
' Pasamos como parámetros un objeto concesión, tipo de comando texto y una sentencia SQL
Dim xreader As XmlReader = SqlHelper.ExecuteXmlReader(conn, CommandType.Text, "SELECT * FROM Customers FOR XML AUTO")
   While (xreader.Read()) 

‘ Vamos pegando el resultado en una caja de Texto
txtResults.Text = txtResults.Text + xreader.ReadOuterXml() + Environment.NewLine
End While
Observamos el resultado y Oh, cual sorpresa?. Solo con estas líneas obtenemos una representación de los datos con formato XML. 

Conclusiones

Vemos que de manera muy simple podemos acceder a los datos, manejar con facilidad los objetos dataset, datareader y XML!!!.

Con estos “Application bloque” nuestra vida se hace mas fácil, nos permite tener código mas ordenado y eficiente. Nos libera de los errores “tontos” como son las conexiones que quedan abiertas u otros recursos que olvidamos liberar después de usarlos.

Les recomiendo fuertemente bajar este assembly y estudiarlo mas detenidamente ya que ofrece mucho mas de lo que hemos visto aquí. Viene acompañado de una breve documentación y ejemplos de utilización de cada uno de los métodos.

Por último, si uds. Son desarrolladores “inquietos”, que se bajan cuanto producto o herramienta anda por ahí, muy probablemente ya tengan instalada esta dll. Solo por curiosidad hagan una búsqueda de microsoft.applicationsblock.data.dll . Muchas herramientas de desarrollo ya lo han implementado, por lo que vale la pena incursionar en este tema.

Seria bueno saber de ustedes que otras herramientas están usando. Hace un tiempo estoy incursionando en el tema de los generadores de código, por lo que seria muy provechoso escuchar de sus propias experiencias.

Agradeceré sus comentarios, como así también calificar este articulo. Estoy en carrera para obtener mi cuarta estrella y su calificación será muy bienvenida. Con gusto recibiré sus emails y compartiré con uds. Este desafió.


ir al índice