21 de septiembre de 2008

Conexiones a Bases de Datos en C#

En la actualidad, el acceso a datos por parte de nuestros programas de escritorio es algo indispensable, y el uso de bases de datos dan fe de ello, tanto en el trabajo como en la vida universitaria de cualquier estudiante de computación y afines.

En vista de ello, y ya que actualmente me encuentro estudiando C#, me animé a incursionar más en el mundo del software propietario y aprovechar las herramientas y tecnologías que proveen.


ADO.NET es una colección de clases, interfaces, estructuras y tipos enumerados que permiten acceder a los datos almacenados en una base de datos desde la plataforma .NET. Si bien se puede considerar una versión mejorada de ADO, no comparte con éste su jerarquía de clases.

DO .NET usa XML. De hecho, los conjuntos de datos se almacenan internamente en XML, en vez de almacenarse en binario como sucedía en ADO. Al estar los datos almacenados en XML, se simplifica el acceso a los datos a través de HTTP (algo que ocasiona problemas en ADO si los datos tienen que pasar cortafuegos). Por otro lado, se simplifica la comunicación entre aplicaciones al ser XML un formato estándar.

Con ADO .NET se puede acceder a los datos de dos formas distintas:

  • Acceso conectado: Acceso sólo de lectura con cursores unidireccionales ("firehose cursors"). La aplicación realiza una consulta y lee los datos conforme los va procesando con la ayuda de un objeto DataReader.
  • Acceso desconectado: La aplicación ejecuta la consulta y almacena los resultados de la misma para procesarlos después accediendo a un objeto de tipo DataSet. De esta forma, se minimiza el tiempo que permanece abierta la conexión con la base de datos.

Al proporcionar conjuntos de datos de forma desconectada, se utilizan mejor los recursos de los servidores y se pueden construir sistemas más escalables que con ADO (que mantenía abierta la conexión con la base de datos la mayor parte del tiempo). Este enfoque resulta más adecuado en sistemas distribuidos como Internet.

Ahora vamos a ver unos cuantos códigos de ejemplo de conexiones de base de datos en C#.

Si tenemos una base de datos en SQL Server (aunque funciona para cualquier base que se encuentre registrada previamente en el DSN de usuario), de nombre “ModeladorSQL” en el DSN de Usuario y con nombre del servidor = “HOME” (el nombre del computador), el código de una conexión será de la siguiente manera:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace WindowsApplication1
{
class ejemplo1
{
SqlConnection conexion;

public ejemplo1()
{

inicializarConexionBD();
consultaBD();
cerrarConexionBD();
}

private void cerrarConexionBD()
{
conexion.Close();
}

private void inicializarConexionBD()
{
conexion = new SqlConnection("Server=HOME;Database=ModeladorSQL;Integrated Security=True");
conexion.Open();
}

private void consultaBD()
{
SqlDataReader dr;
SqlCommand comm = new SqlCommand("Select nombre from Tipo_Atributo",conexion);
dr = comm.ExecuteReader();
while(dr.Read())
{
Console.WriteLine(dr.GetString(0));

}
}
}
}


La sencilla aplicación busca reportar la primera columna del resultado de la consulta, la cual devuelve todos los atributos “nombre” de la tabla “Tipo_Atributo”

Otra forma de obtener el mismo resultado, pero de una manera más elaborada es la siguiente, solo reemplazamos el procedimiento consultaBD por el que se muestra a continuacion:


private void consultaBD()

{
DataSet d = new DataSet();
SqlCommand com = new SqlCommand("Select nombre from Tipo_Atributo",conexion);
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = com;
sda.Fill(d);
DataTable data = d.Tables[0];
foreach (DataRow dr in data.Rows)
{
int i;
for (i = 0; i < data.Columns.Count; i++)
{
Console.WriteLine(dr[i].ToString());
}
}
}


En el ejemplo anterior hacemos uso de un objeto de tipo DataSet,una caché de memoria interna de datos recuperados desde un origen de datos. Este tipo de estructura permite almacenar más de una tabla dentro de ella. Para hacer uso de ella en las consultas, es necesario declarar un SqlDataAdapter, el cual llenará los datos de la consulta dentro de ella, en una nueva tabla.

ODBC.NET es un componente complementario del Kit de desarrollo de software (SDK) de Microsoft .NET Framework. Proporciona acceso a los controladores ODBC nativos de la misma manera que el proveedor de datos de OLE DB .NET proporciona acceso a los proveedores de OLE DB nativos. Aunque el proveedor de datos de ODBC .NET está pensado para trabajar con todos los controladores ODBC compatibles, sólo se ha probado con los siguientes:

  • Controlador ODBC de Microsoft SQL
  • Controlador ODBC de Microsoft para Oracle
  • Controlador ODBC de Microsoft Jet

Las conexiones, sin embargo son bastante similares a las hechas usando ADO.NET, aunque no con la potencialidad de esta ultima. Veamos un ejemplo:

Asumiendo que la base de datos se encuentra en SQL Server 2000, que el servidor se llama “HOME” y que la base de datos, en orígenes de datos se encuentra registrada como “modeladorSQL”.

using System;
using System.Data;
using System.Data.Odbc;

namespace WindowsApplication1
{
class ejemplo2
{
OdbcConnection conexion;

public ejemplo2()
{
inicializarConexionBD_ODBC();
consulta_ODBC();
cerrarConexionBD();
}

private void cerrarConexionBD()
{
conexion.Close();
}

private void inicializarConexionBD_ODBC()
{
conexion = new OdbcConnection("Driver={SQL Server};Server=HOME;Database=modeladorSQL;IntegratedSecurity=True");
conexion.Open();
}

private void consulta_ODBC()
{
OdbcCommand comm;
comm = new OdbcCommand("Select nombre from Tipo_Atributo", conexion);
OdbcDataReader reader = comm.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
}
}
}
}

Esta es una forma sencilla de conectar una base de datos, sin embargo podemos hacerlo de una manera más elaborada:

private void consulta_ODBC()
{
OdbcCommand comm;
DataSet d = new DataSet();
comm = new OdbcCommand("Select nombre from Tipo_Atributo",conexion);
OdbcDataAdapter da = new OdbcDataAdapter();
da.SelectCommand = comm;
da.Fill(d);
DataTable data = d.Tables[0];
foreach (DataRow dr in data.Rows)
{
for (int i = 0; i < data.Columns.Count; i++)
{
Console.WriteLine(dr[i].ToString());
}
}
}


Vemos que trabaja con estructuras similares a ADO.NET, como objetos DataView, OdbcDataAdapter muy similar a SqlDataAdapter. Depende de gustos, de la aplicación y del gestor de base de datos a utilizar. Hay que tener en cuenta que en ODBC especificamos el driver a utilizar para la base de datos correspondiente, algo que no se ve en ADO.NET.. en fin..

Espero que les sea de utilidad . Saludos

Fuentes:

http://support.microsoft.com/kb/310988/es
http://msdn.microsoft.com/es-es/library/system.data.dataset(VS.80).aspx
http://elvex.ugr.es/decsai/csharp/databases/index.xml

2 comentarios:

Jose dijo...

Hola buen día,
he visto tu entrada y me parece bien, solo quisiera decirte o pedirte una explicacion, con respecto a la conexion a la BD, como tendria que hacer si tengo un Form MDI con varios hijos que realizan operaciones contra la BD, el asunto es con la conexion,

1. usar una conexion global
2. usar algun patron para la conexion

saludos

jose luis dijo...

me gustaria saber como definiste la conexion para tus forms MDI
saludos.