usando sqlhelper

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

Upload: api-3755950

Post on 07-Jun-2015

5.234 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Usando SQLHelper

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

Page 2: Usando SQLHelper

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

Page 3: Usando SQLHelper

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

Page 4: Usando SQLHelper

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

Page 5: Usando SQLHelper

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

Page 6: Usando SQLHelper

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