Sie sind auf Seite 1von 6

Application Blocks: Data Access .

Net
[Acceda a los datos en forma eficiente, prolija y reduzca las lneas de cdigo]
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 adems, 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. Despus de ver su contenido y analizarlo en profundidad me pareci tremendamente prctico y decid incorporarlo a mi set de herramientas de desarrollo. Estoy hablando de Application Blocks (algo as como ladrillos para la construccin de aplicaciones) y en este caso, especficamente 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 aplicacin 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 tambin la interfase con el usuario, la cual nos lleva bastante tiempo tambin, pero ese es otro tema que no es parte de este artculo. 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 prcticas 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 mayora 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 parmetros. 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 mtodos: ExecuteNonQuery. Este mtodo 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 mtodos 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 denominacin de los mtodos de la clase SqlHelper, se debe notar que son similares con los mtodos descriptos en ADO.NET. Es que, en realidad, se trata de una implementacin de ADO.NET, pero a un nivel macro. Afortunadamente de esta forma resulta ms fcil de asimilar y entender cada uno de estos mtodos al momento de requerir aplicar alguno de ellos. Si bien cada uno de estos mtodos estn sobrecargados (overloaded) brindando mayores opciones de uso, a los efectos de hacer ms simple la lectura y entendimiento de este artculo, veremos los casos de uso ms simples. La idea es que a partir de esta introduccin ustedes exploren las distintas variantes de cada uno de estos mtodos que encontraran en el apartado Referencia de la documentacin que acompaa al ensamblado. Este lo pueden bajar desde:

http://www.microsoft.com/downloads/details.aspx?FamilyId=F63D1F0A-9877-4A7B-88EC0426B48DF275&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 seccin Referencias: Agregar una referencia a Microsoft.ApplicationBlocks.Data.dll.

Agregar una lnea 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 mtodos 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 tambin para consultas que devuelvan resultados a travs de parmetros. Ejemplos claros son operaciones de actualizacin de la base de datos como Insert, Update, Delete o ejecutar una consulta o procedimiento almacenado que devuelva algn parmetro. A continuacin 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 parmetro de entrada la identificacin del producto. Este devolver tres parmetros que son: el nombre del producto, el precio unitario y la cantidad. Define los parmetros 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 mtodo ExecuteNonQuery de la clase SqlHelper ' Pasamos como parmetros la cadena de conexin, 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 parmetros 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 excepcin Throw ex End Try Vemos como con una simple lnea de cdigo resolvemos la consulta.

ExecuteDatareader Utilizaremos Datareader cuando requerimos recuperar mltiples filas de una base de datos que sern devueltos en un objeto SqlDataReader. Estos datos sern 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 Categora que devuelve una lista de productos dentro de una categora especfica. P asamos como parmetros la cadena de conexin 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 (descripcin 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 mtodo 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 ms tablas y opcionalmente las relaciones entre ellas. Es un objeto desconectado, es decir lee la informacin de la base de datos, se desconecta y se olvida de la fuente de datos. Se trabaja en forma aislada y provee mtodos de actualizacin de la base de datos y que adems 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 identificacin 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 pas seleccionado.

Private constring As String = "Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=myserver\SQLServer;Connect Timeout=30" 'Pasamos como parmetros la cadena de conexion, el tipo de comando texto y la sentencia SQl con el parametro de seleccin por pas. 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 clusula 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 parmetros un objeto concesin, 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 lneas obtenemos una representacin 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 fcil, nos permite tener cdigo mas ordenado y eficiente. Nos libera de los errores tontos como son las conexiones que quedan abiertas u otros recursos que olvidamos liberar despus de usarlos. Les recomiendo fuertemente bajar este assembly y estudiarlo mas detenidamente ya que ofrece mucho mas de lo que hemos visto aqu. Viene acompaado de una breve documentacin y ejemplos de utilizacin de cada uno de los mtodos. 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 bsqueda 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 estn usando. Hace un tiempo estoy incursionando en el tema de los generadores de cdigo, por lo que seria muy provechoso escuchar de sus propias experiencias. Agradecer sus comentarios, como as tambin calificar este articulo. Estoy en carrera para obtener mi cuarta estrella y su calificacin ser muy bienvenida. Con gusto recibir sus emails y compartir con uds. Este desafi.

Das könnte Ihnen auch gefallen