Sei sulla pagina 1di 6

SINFOCORP S.R.L.

Application Blocks: Data Access .Net


[Acceda a los datos en forma eficiente, prolija y reduzca las líneas de código]

Colaboración: El Guille

Carlos Hidalgo Lache 1


SINFOCORP S.R.L.

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:

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

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

Carlos Hidalgo Lache 2


SINFOCORP S.R.L.

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

Carlos Hidalgo Lache 3


SINFOCORP S.R.L.

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.

Carlos Hidalgo Lache 4


SINFOCORP S.R.L.

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.

Carlos Hidalgo Lache 5


SINFOCORP S.R.L.

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.

Carlos Hidalgo Lache 6

Potrebbero piacerti anche