Bueno, esta vez hablaremos sobre ADO.NET, la evolución de la arquitectura de acceso a datos de Micro$oft…
ADO = ACtiveX Data Objects, ADO.NET provee a los programadores .NET de un acceso a las fuentes de datos relacionales, XML y aplicaciones de datos, es una gran herramienta que puede trabajar con diversos proveedores de datos, desde Sql Server, hasta Oracle y MySql…
Esta vez voy a mostrarles como crear procedimientos con los objetos básicos de ADO.NET para conectarse y trabajar con una base de datos hecha en Sql Server…
Primero pasarémos a revisar los principales objetos de ADO.NET:
Objeto DataReader: proporciona un acceso rápido y unidireccional (solo hacia adelante) a los datos, es de solo lectura.
Objeto DataSet: proporciona una representación relacional de los datos en memoria, es decir, es capaz de crear tablas y relaciones en memoria para trabajar en ellas.
Objeto DataAdapter: sirve como un puente entre el DataSet y el origen de los datos.
Objeto Command: proporciona lo que Micro$oft llama Funcionalidad Explícita, que consiste en los métodos ExecuteNonQuery para las operaciones que no devuelven un resultado a la consulta, (Insert, Update, Delete), y ExecuteScalar para funciones que devuelven un único valor en lugar de un conjunto de filas.
Ahora, una forma de optimizar nuestro trabajo es identificar el tipo de cosulta que haremos, a modo de ejemplo tomaremos tres casos:
- Consulta Lineal con un flujo de datos hacia adelante y de solo lectura: Puede utilizarse este modo para el tipo de consultas simples que no requieren de mucha interacción del usuario o de actualizarse o regresar a un registro anterior, esto lo hacemos con el objeto DataReader, que fue diseñado para mantener una conexión permanente con el origen de datos mientras este activo, su función, básicamente, es leer los registros de la consulta de a uno en uno y en dirección hacia adelante (Forward-Only).
- Consulta de tipo Desconectado: Puede proveer una representación totalmente desconectada de los datos, para que el usuario pueda manipularlos sin verse restringido por problemas de recursos del servidor o disponibilidad de la fuente de datos, podemos utilizar el objeto DataSet, dentro del cual podemos contener tablas con los resultados de nuestras consultas no importando el origen de estos, (base de datos, archivos xml, o datos que genera la aplicación), esto permite una flexibilidad mayor cuando se trabaja con datos relacionados y permite exportarlos como archivos Xml.
- Recuperar y actualizar desde una fuente de datos: Bueno, esto es medio sencillo si se ve así: el DataAdapter se conecta con el origen de datos y permite llenar el DataSet con los resultados, al manipular, modificar o/y actualizar los datos en el DataSet, también permite actualizarlos en el origen de datos.
Ahora, después de toda esta (necesaria) chachara, hemos de pasar a los ejemplos prácticos de utilización de los objetos de ADO.NET para establecer conexión y trabajar con un origen de Datos, (Micro$oft Sql Server)
Veremos primero como importar el espacio de nombre necesario para trabajar con los objetos para el servidor sql, luego, declarar los objetos y conectarse a la base de datos…
Imports System.Data.SqlClient
Luego necesitamos declarar una variable que nos diga dónde está el servidor y como se llama la base…
Public Conexion As String = «Server =Server_1;packet size=4096;integrated security=SSPI;data source=Server_1;persist security info=False;initial catalog=Estudiantes»
Esta es una de las cadenas más sencillas donde se establece el nombre del servidor y la base de datos, aunque si necesitamos declarar Usuario y Password utilicemos esta:
Public Conexion As String = «Server =Server_1;packet size=4096;User Id=Axl;Password=123;data source=Server_1;initial catalog=Estudiantes»
Tengo que recordarles, que en SQL, si utilizamos un usuario y password para entrar a la base, tenemos que darle permisos a ese usuario en todas las propiedades de las tablas que queramos que tenga acceso, en especial los Stored Procedures, que hay que marcarlos uno por uno 😦
luego declaramos los objetos necesarios para empezar a trabajar…
Dim Cmd As New SqlCommand Dim Cnn As New SqlConnection Dim Sql As String Dim Dr As DataRow Dim Da As New SqlDataAdapterEstos objetos los utilizaremos en cuatro procedimientos que crearemos a continuación, Consulta de Busqueda, Inserción, Actualización y Eliminación…
Busqueda:
Dim ds As New Data.DataSet Sql = “Select * from Materias” Cnn = New SqlConnection(Conexion) Cnn.Open() Da = New SqlDataAdapter(Sql, Cnn) Da.Fill(ds) Cnn.Close()Explicación (línea por línea):
Declara un Objeto tipo Dataset para depositar los datos de la consulta.
Asigna la cadena de la consulta a la variable “Sql” (tipo string)
Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo
Abre la conexión con la propiedad .Open() del SqlCommand
Le da al SqlDataAdapter la cadena de consulta y el objeto de conexión
El SqlDataAdapter tiene la especial propiedad .Fill que vuelca todo lo que tiene en el objeto entre los paréntesis, (el dataset), y ojo que solo lo hace en un dataset.
Cuando has volcado el contenido de la consulta en el dataset simplemente cerras la conexión.
Ojo y doble ojo en esto, se debe cerrar cada conexión que se abra, no importa que tipo de consulta se haga, las conexiones abiertas se acumulan y pueden volar tu servidor y simplemente se quedará pegado.
Actualización:
Sql = «Update » & tabla & » Set » & camposyvalores & » Where » & condicion Cnn = New SqlConnection(Conexion) Cnn.Open() Cmd = New SqlCommand(Sql, Cnn) Cmd.ExecuteNonQuery() Cnn.Close()Explicación (Línea por línea):
Asigna la cadena de la consulta a la variable “Sql” (tipo string)
Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo
Abre la conexión con la propiedad .Open() del SqlCommand
Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql
Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.
Como ya lo he dicho antes, hay que cerrar la conexión.
Eliminación:
Sql = «Delete From » & tabla & » Where » & condicion Cnn = New SqlConnection(Conexion) Cnn.Open() Cmd = New SqlCommand(Sql, Cnn) Cmd.ExecuteNonQuery() Cnn.Close()Explicación (Línea por línea):
Asigna la cadena de la consulta a la variable “Sql” (tipo string)
Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo
Abre la conexión con la propiedad .Open() del SqlCommand
Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql
Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.
Como ya lo he dicho antes, hay que cerrar la conexión.
Inserción:
Sql = «Insert Into » & tabla & » (» & campos & «) Values (» & valores & «)» Cnn = New SqlConnection(Conexion) Cnn.Open() Cmd = New SqlCommand(Sql, Cnn) Cmd.ExecuteNonQuery() Cnn.Close()Explicación (Línea por línea):
Asigna la cadena de la consulta a la variable “Sql” (tipo string)
Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo
Abre la conexión con la propiedad .Open() del SqlCommand
Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql
Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.
Como ya lo he dicho antes, hay que cerrar la conexión.
Ok, si han sido buenos observadores habrán descubierto que en los últimos tres procedimientos solo cambia la instrucción Sql, por lo demás son iguales, ¿Porque?, porque a mi juicio, hay dos tipos de instrucciones, Las que te devuelven algo y las que no te devuelven nada. El Select te devuelve algo, lo que sea, un campo, una fila, una columna, una tabla, cualquier cosa, los demás (Insert, Update, Delete) no te devuelven nada por eso usamos el .ExecuteNonQuery del amigo SqlCommand y podemos utilizar el mismo código para los tres.
Como lo he dicho desde la primera entrada que hice en nuestro blog, utilizaré los métodos más simples para hacer las cosas, porque bueno, Occam dijo que la respuesta más simple y obvia es casi siempre la mas probable, (en nuestro caso, no es solo la única), pero no siempre la correcta. Hay muchas formas de hacer las cosas, pero trataremos de tomar las más fáciles y las más prácticas.
Saludos…