sábado, 27 de junio de 2009

Operaciones Básicas sobre datos con ADO.NET 2.0 Parte III de III

Después de explicar los conceptos sobre las operaciones con los datos y sobre las clases de .NET que nos sirven para almacenar y manipularlos, ahora voy a explicar lo que se necesita para trabajar con una fuente de datos (con una base de datos SQL Server 2005).
Para trabajar con una fuente de datos se necesita utilizar un proveedor, alguien 'intermedio' para poder conectarse con esa fuente, recoger los datos, modificarlos y actualizarlos. Pues bien, para eso necesitamos hacer uso de algunos proveedores, entre los que destacan:
Los proveedores ODBC y OLEDB son utilizados para algunas fuentes como Excel o Access, sin embargo, el rendimiento de nuestras aplicaciones bajan si utilizamos bases de datos como SQL Server, MySQL, Oracle, etc., ya que dichos proveedores son implementados sólo para fines de compatibilidad con algunos lenguajes y aplicaciones y no exponen toda la funcionalidad de cada una de estas fuentes.
Para resolver este problema, ADO.NET ofrece un proveedor nativo .NET para SQL Server y Oracle, en el espacio de nombres System.Data.SqlClient y System.Data.OracleClient respectivamente. Las clases que se encuentran en estos espacios de nombres heredan la funcionalidad de las clases ubicadas en el espacio de nombres System.Data.Common, que como su nombre lo indica, son clases básicas Comunes que comparten y 'deben' compartir los proveedores de datos para .NET, es por eso que hay librerías MySQL para .NET, Interbase, etc., sólo heredan el comportamiento de las principales clases que nos sirven para la manipulación de los datos:
  • DbConnection: Representa una conexión a una fuente (o base) de datos.
  • DbCommand: Representa un procedimiento almacenado en la base de datos o una instrucción SQL.
  • DbDataAdapter: Representa un conjunto de comandos de datos y una conexión de base de datos que se utilizan para rellenar un System.Data.DataSet y actualizar una base de datos.
*Reemplaza las iniciales 'Db' y utilizalas para fuente de datos, por ejemplo, si utilizas SQL Server, será SqlConnection, SqlDataAdapter, etc.
La clase más compleja y la más util es DbDataAdapter, ya que ella permitirá recoger y actualizar los datos en la fuente de una manera transparente al usuario.
Veamos un ejemplo de el uso en SQL Server 2005 siguiendo el ejemplo de la tabla alumnos del post anterior:

Dim sqlConexion As New SqlClient.SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=alumnos;Integrated Security=True")

'Creamos el adaptador de datos que nos servir para realizar las operaciones
'a la base de datos, utilizando algunos comandos, le pasamos como parámetro la sentencia
'SQL para seleccionar todos los registros y la conexión que se utilizar
Dim sqlAdaptador As New SqlClient.SqlDataAdapter("SELECT idAlumno, nombre, telefono, fechaNac FROM alumnos", sqlConexion)

'Podemos establecer las demás operaciones con los datos a través de las propiedades:
'InsertCommand (de tipo SqlCommand) que nos sirve para Agregar registros a la BD
sqlAdaptador.InsertCommand = New SqlClient.SqlCommand("INSERT INTO alumnos VALUES (nombre=@nombre, telefono=@telefono, fechaNac=@fechaNac)")

'Agregamos los parámetros, para evitar inyecciones sobre las sentencias SQL
'Como observación: (los parámetros en SQLServer y Access se escriben con la '@' al inicio)
'y por ejemplo en MySQL deben empezar con el smbolo '?'
sqlAdaptador.InsertCommand.Parameters.Add("@nombre", SqlDbType.NVarChar, 35)
sqlAdaptador.InsertCommand.Parameters.Add("@telefono", SqlDbType.VarChar, 12)
sqlAdaptador.InsertCommand.Parameters.Add("@fechaNac", SqlDbType.DateTime)
'UpdateCommand sirve para actualizar registros ya existentes
sqlAdaptador.UpdateCommand = New SqlClient.SqlCommand("UPDATE alumnos SET (nombre=@nombre, telefono=@telefono, fechaNac=@fechaNac) WHERE idAlumno=@idAlumno")

'Agregamos los parámetros, para evitar inyecciones sobre las sentencias SQL
sqlAdaptador.UpdateCommand.Parameters.Add("@nombre", SqlDbType.NVarChar, 35)
sqlAdaptador.UpdateCommand.Parameters.Add("@telefono", SqlDbType.VarChar, 12)
sqlAdaptador.UpdateCommand.Parameters.Add("@fechaNac", SqlDbType.DateTime)
sqlAdaptador.UpdateCommand.Parameters.Add("@idAlumno", SqlDbType.Int)
'DeleteCommand sirve para eliminar físicamente los registros en una tabla en la base de datos
sqlAdaptador.DeleteCommand = New SqlClient.SqlCommand("DELETE FROM alumnos WHERE idAlumno=@idAlumno")
'Agregamos los parámetros, para evitar inyecciones sobre las sentencias SQL
sqlAdaptador.DeleteCommand.Parameters.Add("@idAlumno", SqlDbType.Int)

'ahora ya tenemos nuestro adaptador listo para utilizarse con los mtodos, Fill y Update
sqlAdaptador.Fill(alumnosDS)
'podemos hacer las operaciones pertinentes sobre los datos en el DataSet 'alumnosds', va el post 2
'finalmente actualizamos esos cambios en la base de datos con un solo método que se encarga de hacer
'las operaciones necesarias (insertar, actualizar o eliminar)
sqlAdaptador.Update(alumnosDS)
Nota: El servidor de la fuente de datos, la base de datos, la tabla, los campos utilizados en este ejemplo son ficticios y utilizados para demostrar el uso de las clases que nos sirven para la manipulación de los datos.

lunes, 15 de junio de 2009

Operaciones Básicas sobre datos con ADO.NET 2.0 Parte II de III

En el post pasado, se definieron los conceptos para trabajar con datos en ADO.NET, ahora veremos los objetos y clases que se utilizan para la manipulación de los datos.

.NET ofrece un conjunto de clases que nos sirven para crear objetos que nos permitan llenar los datos provenientes de un origen de datos (un servidor de base de datos o un archivo de bd, como Access, SQL Server, Oracle, MySQL, etc.), leer estos datos (y poder presentárselos al usuario), actualizar estos datos (añadiendo nuevos registros, borrando y modificando algunos otros, y regresar los datos al origen para que se actualicen todos estos cambios. Las clases mas importantes y significativas pertenecen al espacio de nombres System.Data, y son las siguientes:

DataSet: Es la clase mas importante en el entorno de ADO.NET 2.0, contiene una representación de los datos en memoria, en él se almacenan tablas (y éstos a su vez registros) y las relaciones que hay entre ellas. Los objetos 'DataSet' son utilizados independientemente del manejador de base de datos, es decir NO son exclusivos de SQL Server, por ejemplo, ni de ningun otro manejador, así también lo podemos utilizar sin necesidad de un proveedor. Podríamos definir al DataSet, como una copia de los datos que han sido consultados en un proveedor de datos.

Esta clase DataSet, la podemos utilizar para crear conjuntos de datos con una estructura previamente definida, como si fuera una base de datos, con tipos de datos tipados, relaciones entre tablas, etc, mediante la herencia, a este tipo de clases se le conoce como DataSet tipados.

Ejemplo:
'objeto DataSet 'genérico'
Dim alumnosDS as DataSet = new DataSet()

'objeto DataSet 'tipado' (la clase AlumnoDS hereda de DataSet) con tipos predefinidos
Dim alumnosDS as AlumnoDS = new AlumnoDS()

DataTable: Esta clase representa a una Tabla en memoria, para que podamos hacer operaciones con ella y sus datos, y, siempre está contenida dentro de un DataSet, con ninguna o con otras tablas.

Ejemplo:
'En este caso, hemos declarado una tabla 'genérica', es decir, puede contener
'cualquier tipo de datos cuando se crea.
Dim tablaAlumnos as DataTable = new DataTable()
'Añadimos mediante código sus columnas...
tablaAlumnos.Columns.Add("nombre",GetType(String))
tablaAlumnos.Columns.Add("telefono",GetType(String))
tablaAlumnos.Columns.Add("fechaNac",GetType(DateTime))
'Nota: cuando se crea una tabla a partir de un dataset tipado, no es necesario (ni
'recomendable, a menos que sea muy necesario) agregar, eliminar y modificar sus columnas,
'ya que puede haber problemas si es que intentamos actualizar en un origen de datos.

DataRow: Representa un registro en memoria, y comúnmente la utilizamos cuando queremos obtener un registro de una tabla, o cuando ingresamos uno nuevo.

Ejemplo:
'Con esta instrucción, la tabla 'crea' un nuevo registro según su estructura
Dim nuevoReg as DataRow = tablaAlumnos.NewRow()
'una vez creado, podemos asignarle los valores que el usuario introdujo (por ejemplo)
nuevoReg("nombre") = "Su nombre"
nuevoReg("telefono") = "XXXX"
nuevoReg("fechaNac") = new DateTime(1990,1,1)
'y luego lo introducimos a su tabla que lo creo
tablaAlumnos.Rows.Add(nuevoReg)

Nota: ya que estamos tratando con el modelo 'desconectado', debemos tener en cuenta que los datos no están actualizados al 100% con el proveedor de datos, es decir no son persistentes.

miércoles, 10 de junio de 2009

Operaciones Básicas sobre datos con ADO.NET 2.0 Parte I de III

Cuando comenzamos a aprender un nuevo lenguaje, siempre nos topamos con lo mismo, ¿Cómo insertar, eliminar, modificar y consultar sobre una tabla en una Base de Datos?, y a veces resulta que ni si quiera sabemos cómo empezar, ni por dónde, qué Clases utilizar para ello, aquí un resumen...

Este post, se refiere a las operaciones con los datos dentro de una base de datos, un repositorio muy común, y la manera es algo distinta cuando se trata de otros repositorios, como archivos de texto, xml, etc.

Bien, las operaciones sobre una base de datos consiste en el acrónimo 'CRUD' (en inglés Create, Read, Update and Delete), que es lo mismo que Crear o Insertar, Leer, Actualizar y Eliminar los datos, vamos a hacer estas operaciones en ADO.NET 2.0 (ADO [Access Data Object]: Acceso a Datos) con Visual Studio 2005, pero es válido para Visual Studio 2008.

Antes de empezar a explicar el acceso a datos, tengo que mencionar que para entender más un poquito de esto, asumo que tienen conocimientos sobre bases de datos, creación de tablas, relaciones y consultas, ya que el objetivo de este post es sobre el acceso a los datos, y no sobre la creación de ellos, espero poner un post sobre bases de datos.

Existen 2 maneras de conectarse a la base de datos para hacer las operaciones sobre alguna tabla:
  1. Modo conectado: consiste en tener una conexión abierta siempre al servidor de BD, y de ahí estar leyendo los datos para mostrarlos al usuario. Esta forma tiene sus ventajas, los datos están actualizados siempre, mejor manejo de concurrencia, etc. Se utiliza cuando se desea mantener siempre los datos mas recientes en el cliente.
  2. Modo desconectado: consiste en hacer las operaciones con los datos cada vez que el cliente lo necesita. Sus ventajas son que sólo ocupamos conexiones y el ancho de banda cada vez que necesitemos hacer una consulta sobre la base de datos, y de ahí trabajamos con una copia local de los datos en nuestro sistema, podemos desconectarnos del servidor temporalmente y modificar los datos y así cuando necesitemos actualizarlos, volvemos a hacer las consultas pertinentes en la base de datos.
Voy a explicar únicamente el modo desconectado ya que a mi parecer es el más utilizado por la mayoría de los proyectos, y el más simple de comprender.

Bien, las operaciones sobre la base de datos como sabrán son:
  • Select, para hacer una consulta de los datos.
  • Insert, para Ingresar los registros en una tabla base de datos.
  • Update, para Actualizar los registos en la tabla.
  • Delete, para Borrar los registros en la tabla.

Éstas son las operaciones 'CRUD' en una base de datos.

martes, 2 de junio de 2009

Una nueva forma de aprender .NET y obtener beneficios por ello

Me acabo de enterar (y no sé porque no lo hice antes) de un programa que Microsoft tiene para quienes deseen aprender o migrar de otra tecnología a .NET (como php, java, etc.) llamado Ramp Up

Este programa te va llevando de la mano con muchos recursos como artículos, codecast, slidecast, laboratorios en línea, etc. de acuerdo al curso que te hayas inscrito, y además, cuando lo terminas, puedes obtener un reconocimiento de graduación y premios (como vouchers de descuento).

Los cursos son los siguientes:
Ya me inscribí, y estoy tomando el curso de VS2008, no está por demás reafirmar los conocimientos.
Se los recomiendo!!!