Para poder hablar de las conexiones de ADO.NET debemos conocer algunas de las propiedades de las cadenas de conexion, entre las cuales podemos ver las siguientes:
Application Name: Nombre de la aplicacion que se esta conectando a la base de datos. A efectos de obtener informacion exacta sobre la actividad en el servidor, es conveniente hacer el uso de esta propiedad, que por defecto no se utiliza
Connection Timeout: Es el lapso de tiempo, medido en segundos, durante el cual una conexion esperará conseguir el vinculo con la base de datos. Superado este tiempo, se disparará una excepcion que indica que no pudo establecerce la conexion. Si no establecemos esta propiedad, se asumirá el valor por defecto de 15 segundos, esta propiedad tambien es llamada Connect Timeout.
Data Source: Como su nombre en ingles lo indica, es la fuente de datos. En el caso de SQL Server, es el nombre o la direccion IP del servidor al cual nos intentamos conectar, por lo cual tambien pueden utilizarse indistintamente las claves Server ó Address. En el caso de las bases de datos en archivos, tales como Access ó DBF entre otros, el valor será el camino para llegar a ellos a través del sistema de archivos (ejem. c:\directorio\basededatos.mdb), en ODBC esta propiedad se llama DBQ.
Initial Catalog: En el estandar ANSI SQL, se le llama catalogo a lo que normalmente entendemos como base de datos en SQL Server. Esta propiedad suele ser inexistente en algunos proveedores de datos, ya que la misma propiedad Data Source queda indicada la base de datos. Esta clave puede llamarse tambien Database.
Network Library: En el caso de SQL Server, se utiliza para indicar la biblioteca de red en uso, la cual depende del protocolo de red utilizado para la comunicacion. Se suele utilizar en entornos que contengan protocolos de red heredados de otras plataformas o en ambientes de alta seguridad que contengan zonas desmilitarizadas entre bases de datos y los servidores web a través de dobles firewalls.
Entre los protocolos de red que tenemos para usarlos cuando nos conectemos con SQL Server estan los siguientes:
dbnmpntw (Named Pipes)
dbmssocn (Winsock TCP/IP)
dbmsspxn (SPX/IPX)
dbmsvinn (Banyan Vines)
dbmsrpcn (Multi-Protocol (Windows RPC))
Integrated Security: Ciertos servidores de bases de datos, tales como SQL Server y Oracle, confian en el esquema de seguridad provista por el sistema operativo, siendo incluso la opcion recomendada siempre que sea posible, ya que no solo simplifica la administracion sino que tambien se incrementa la seguridad. Los valores posibles son true, false, no, yes ó sspi siendo el último altamente recomendado, aunque significa lo mismo que true. En ODBC, esta propiedad suele llamarse Trusted_connection.
User Id: En el caso de no utilizar seguridad integrada, deberá indicarse el nombre de usuario reconocido y mantenido por la base de datos.
Password: Igual que el caso anterior, La clave debe permanecer en forma de texto plano, por lo cual suele resultar poco seguro una cadena de conexion de este tipo. De todos modos, existen casos en donde puede prescindirse de este tipo de seguridad, con lo cual queda la opcion de encriptar la cadena de conexion por completo para obtener un esquema de seguridad óptimo.
Workstation ID: Es el nombre del equipo que está realizando la conexion. Suele ser útil a la hora de relevar la actividad en un servidor de base de datos SQL Server a traves del Profiler.
Provider: Utilizada en OLEDB para indicar el controlador o driver utilizado para realizar la conexion, como por ejemplo, Microsoft.Jet.OLEDB.4.0 para una base de datos Access.
DSN: ODBC permite establecer conexiones y dejarlas guardadas en un archivo o en el sistema operativo, siendo identificables a través de un nombre. Luego utilizaremos como valor de la propiedad DSN en nuestra aplicacion. Si utilizamos esta propiedad, no es necesario utilizar el resto, ya que todos los datos estan previamente definidos en dicho archivo.
Driver: Utilizado en ODBC. Resulta similar a la propiedad Provider de OLEDB, es decir, nos permite indicar a que tipo de fuente de datos nos vamos a conectar.
En el caso que deseemos acceder a un servidor Sql en la misma maquina que se esta desarrollando, podemos denominarlo de varias maneras: localhost, (local), 127.0.0.1 o . (simplemente un punto).
En el caso de Sql Express debemos colocar el nombre del equipo o cualquiera de las denominaciones anteriores y la instancia, ejem: equipo\instancia.
Algunas de las caracteristicas de una conexion en ADO.NET:
Metodos
Open: Permite abrir la conexion.
Close: Permite cerrar la conexion.
ChangeDatabase: Permite cambiar de base de datos.
ChangePassword: Permite cambiar la clave de usuario.
Dispose: Se encarga de liberar recursos en memoria utilizados por la conexion.
Propiedades
CurrentState: Indica el estado actual de la conexion.
OriginalState: Indica el estado original de la conexion.
Estas dos propiedades son de tipo ConnectionState que es una structura que posee los estados Closed, Open, Broken, Connecting, Executing y Fectching.
Eventos
StateChange: se dispara cuando se cambia el estado de la conexion.
InfoMessage: se dispara cuando cuando el servidor envia un mensaje.
Excepciones: Todas las excepciones en ADO.NET 2.0 heredan de la clase exception a cada una de las clases especificas de los proveedores de datos estos poseen una propiedad llamada Errors (a excepcion de Oracle) y esta es una coleccion de los errores devueltos por el manejador de base de datos. De tal manera que el diagrama quedaria de la siguiente manera:
XxxExeption hereda de Exception
XxxInfoMessageEventArgs hereda de InfoMessage
XxxError
Hay que tener en cuenta que cuando una conexion esta abierta ciertos metodos y propiedades pueden arrojar excepciones al tratar de cambiar sus valores, ejem: si se intenta cambiar la cadena de conexion despues que la conexion esta abierta se disparara la excepcion InvalidOperationException.
Ejemplo de una conexion y manejo de errores
string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";
SqlConnection cn = new SqlConnection(conStr);
string msgStr = "";
bool err = false;
try
{
cn.Open();
}
catch (SqlException sqlEx)
{
err = true;
foreach (SqlError sqlError in sqlEx.Errors)
{
msgStr += "Error nro " + sqlError.Number;
msgStr += " (" + sqlError.Class + "): ";
msgStr += sqlError.Message + "\n";
}
}
catch (InvalidOperationException invOpEx)
{
err = true;
msgStr += "Operacion no permitida: ";
msgStr += invOpEx.Message + "\n";
}
catch (Exception ex)
{
err = true;
msgStr += "Se produjo un error inesperado: ";
msgStr += ex.Message + "\n";
}
finally
{
if (cn.State == ConnectionState.Open)
cn.Close();
if (err)
Console.WriteLine(msgStr);
}
Connection Pooling (fondo comun de conexiones): Durante el ciclo de vida de una conexion esta pasa desde la instanciacion, utilizacion y destruccion. Cada uno de estos pasos consume valiosos recursos fisicos en el cliente, servidor y la red, y si nos vamos mas a detalle consume microprocesador, memoria, acceso a disco y ancho de banda en la red, ademas de ello una aplicacion puede mantener multiples conexiones contra un mismo servidor e incluso sobre la misma base de datos. Es por ello que los motores de las RDBMS (Relational Database Management System ó Sistema de Administracion de Bases de Datos Relacionales) poseen una caracteristica importante llamada Connection Pooling (fondo comun de conexiones).
Connection Lifetime: La conexion se retira del fondo cuando la diferencia entre la hora de creacion y la hora en que la conexion vuelve al fondo es mayor al establecido en esta propiedad, en segundos. Por defecto se encuentra en cero, lo cual le brinda mayor tiempo de vida posible en el fondo.
Enlist: Asume valores true o false, definiendo si la conexion vuelve al pool luego de ser utilizada si existe un contexto coincidente previamente definido. Por defecto se encuentra establecida como true.
Max Pool Size: Cantidad maxima de conexiones permitidas por el fondo. Por defecto posee valor cero (0).
Min Pool Size: Cantidad minima de conexiones permitidas por el fondo. Por defecto posee valor cien (100).
Pooling: Asume los valores true o false, es decir, habilita o deshabilita el fondo. Por defecto esta establecida como true.
En el caso de que el proveedor de datos nativo sea SQL Server ademas de las propiedades anteriores tendremos la propiedad Connection Reset: cada vez que utilizamos una conexion, SQL Server ejecuta en forma automatica un procedimiento almacenado que realiza ciertos controles para asegurarse que el contexto siga siendo el mismo, asi como tambien limpia la informacion en memoria que pueden crearse al utilizar las conexiones (tablas, variables, etc). Este control puede evitarse colocando esta propiedad en false, ya que esta verificacion consume recursos extra al tener que ejecutar dicho procedimiento, y en el caso de SQL Server 7.0, hace un viaje distinto hasta el servidor. Esta propiedad se encuentra en true por defecto, aunque podria eventualmente colocarse en false para poder liberar recursos, pero siempre y cuando estemos seguros que nuestra aplicacion no cambia el contexto de la conexion o que no utiliza tablas temporales u otros objetos en memoria. Es recomendable analizar con mucho detalle el uso de esta propiedad, ya que podriamos obetener resultados adversos en lugar de mejoras.
Application Name: Nombre de la aplicacion que se esta conectando a la base de datos. A efectos de obtener informacion exacta sobre la actividad en el servidor, es conveniente hacer el uso de esta propiedad, que por defecto no se utiliza
Connection Timeout: Es el lapso de tiempo, medido en segundos, durante el cual una conexion esperará conseguir el vinculo con la base de datos. Superado este tiempo, se disparará una excepcion que indica que no pudo establecerce la conexion. Si no establecemos esta propiedad, se asumirá el valor por defecto de 15 segundos, esta propiedad tambien es llamada Connect Timeout.
Data Source: Como su nombre en ingles lo indica, es la fuente de datos. En el caso de SQL Server, es el nombre o la direccion IP del servidor al cual nos intentamos conectar, por lo cual tambien pueden utilizarse indistintamente las claves Server ó Address. En el caso de las bases de datos en archivos, tales como Access ó DBF entre otros, el valor será el camino para llegar a ellos a través del sistema de archivos (ejem. c:\directorio\basededatos.mdb), en ODBC esta propiedad se llama DBQ.
Initial Catalog: En el estandar ANSI SQL, se le llama catalogo a lo que normalmente entendemos como base de datos en SQL Server. Esta propiedad suele ser inexistente en algunos proveedores de datos, ya que la misma propiedad Data Source queda indicada la base de datos. Esta clave puede llamarse tambien Database.
Network Library: En el caso de SQL Server, se utiliza para indicar la biblioteca de red en uso, la cual depende del protocolo de red utilizado para la comunicacion. Se suele utilizar en entornos que contengan protocolos de red heredados de otras plataformas o en ambientes de alta seguridad que contengan zonas desmilitarizadas entre bases de datos y los servidores web a través de dobles firewalls.
Entre los protocolos de red que tenemos para usarlos cuando nos conectemos con SQL Server estan los siguientes:
dbnmpntw (Named Pipes)
dbmssocn (Winsock TCP/IP)
dbmsspxn (SPX/IPX)
dbmsvinn (Banyan Vines)
dbmsrpcn (Multi-Protocol (Windows RPC))
Integrated Security: Ciertos servidores de bases de datos, tales como SQL Server y Oracle, confian en el esquema de seguridad provista por el sistema operativo, siendo incluso la opcion recomendada siempre que sea posible, ya que no solo simplifica la administracion sino que tambien se incrementa la seguridad. Los valores posibles son true, false, no, yes ó sspi siendo el último altamente recomendado, aunque significa lo mismo que true. En ODBC, esta propiedad suele llamarse Trusted_connection.
User Id: En el caso de no utilizar seguridad integrada, deberá indicarse el nombre de usuario reconocido y mantenido por la base de datos.
Password: Igual que el caso anterior, La clave debe permanecer en forma de texto plano, por lo cual suele resultar poco seguro una cadena de conexion de este tipo. De todos modos, existen casos en donde puede prescindirse de este tipo de seguridad, con lo cual queda la opcion de encriptar la cadena de conexion por completo para obtener un esquema de seguridad óptimo.
Workstation ID: Es el nombre del equipo que está realizando la conexion. Suele ser útil a la hora de relevar la actividad en un servidor de base de datos SQL Server a traves del Profiler.
Provider: Utilizada en OLEDB para indicar el controlador o driver utilizado para realizar la conexion, como por ejemplo, Microsoft.Jet.OLEDB.4.0 para una base de datos Access.
DSN: ODBC permite establecer conexiones y dejarlas guardadas en un archivo o en el sistema operativo, siendo identificables a través de un nombre. Luego utilizaremos como valor de la propiedad DSN en nuestra aplicacion. Si utilizamos esta propiedad, no es necesario utilizar el resto, ya que todos los datos estan previamente definidos en dicho archivo.
Driver: Utilizado en ODBC. Resulta similar a la propiedad Provider de OLEDB, es decir, nos permite indicar a que tipo de fuente de datos nos vamos a conectar.
En el caso que deseemos acceder a un servidor Sql en la misma maquina que se esta desarrollando, podemos denominarlo de varias maneras: localhost, (local), 127.0.0.1 o . (simplemente un punto).
En el caso de Sql Express debemos colocar el nombre del equipo o cualquiera de las denominaciones anteriores y la instancia, ejem: equipo\instancia.
Algunas de las caracteristicas de una conexion en ADO.NET:
Metodos
Open: Permite abrir la conexion.
Close: Permite cerrar la conexion.
ChangeDatabase: Permite cambiar de base de datos.
ChangePassword: Permite cambiar la clave de usuario.
Dispose: Se encarga de liberar recursos en memoria utilizados por la conexion.
Propiedades
CurrentState: Indica el estado actual de la conexion.
OriginalState: Indica el estado original de la conexion.
Estas dos propiedades son de tipo ConnectionState que es una structura que posee los estados Closed, Open, Broken, Connecting, Executing y Fectching.
Eventos
StateChange: se dispara cuando se cambia el estado de la conexion.
InfoMessage: se dispara cuando cuando el servidor envia un mensaje.
Excepciones: Todas las excepciones en ADO.NET 2.0 heredan de la clase exception a cada una de las clases especificas de los proveedores de datos estos poseen una propiedad llamada Errors (a excepcion de Oracle) y esta es una coleccion de los errores devueltos por el manejador de base de datos. De tal manera que el diagrama quedaria de la siguiente manera:
XxxExeption hereda de Exception
XxxInfoMessageEventArgs hereda de InfoMessage
XxxError
Hay que tener en cuenta que cuando una conexion esta abierta ciertos metodos y propiedades pueden arrojar excepciones al tratar de cambiar sus valores, ejem: si se intenta cambiar la cadena de conexion despues que la conexion esta abierta se disparara la excepcion InvalidOperationException.
Ejemplo de una conexion y manejo de errores
string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";
SqlConnection cn = new SqlConnection(conStr);
string msgStr = "";
bool err = false;
try
{
cn.Open();
}
catch (SqlException sqlEx)
{
err = true;
foreach (SqlError sqlError in sqlEx.Errors)
{
msgStr += "Error nro " + sqlError.Number;
msgStr += " (" + sqlError.Class + "): ";
msgStr += sqlError.Message + "\n";
}
}
catch (InvalidOperationException invOpEx)
{
err = true;
msgStr += "Operacion no permitida: ";
msgStr += invOpEx.Message + "\n";
}
catch (Exception ex)
{
err = true;
msgStr += "Se produjo un error inesperado: ";
msgStr += ex.Message + "\n";
}
finally
{
if (cn.State == ConnectionState.Open)
cn.Close();
if (err)
Console.WriteLine(msgStr);
}
Connection Pooling (fondo comun de conexiones): Durante el ciclo de vida de una conexion esta pasa desde la instanciacion, utilizacion y destruccion. Cada uno de estos pasos consume valiosos recursos fisicos en el cliente, servidor y la red, y si nos vamos mas a detalle consume microprocesador, memoria, acceso a disco y ancho de banda en la red, ademas de ello una aplicacion puede mantener multiples conexiones contra un mismo servidor e incluso sobre la misma base de datos. Es por ello que los motores de las RDBMS (Relational Database Management System ó Sistema de Administracion de Bases de Datos Relacionales) poseen una caracteristica importante llamada Connection Pooling (fondo comun de conexiones).
Connection Lifetime: La conexion se retira del fondo cuando la diferencia entre la hora de creacion y la hora en que la conexion vuelve al fondo es mayor al establecido en esta propiedad, en segundos. Por defecto se encuentra en cero, lo cual le brinda mayor tiempo de vida posible en el fondo.
Enlist: Asume valores true o false, definiendo si la conexion vuelve al pool luego de ser utilizada si existe un contexto coincidente previamente definido. Por defecto se encuentra establecida como true.
Max Pool Size: Cantidad maxima de conexiones permitidas por el fondo. Por defecto posee valor cero (0).
Min Pool Size: Cantidad minima de conexiones permitidas por el fondo. Por defecto posee valor cien (100).
Pooling: Asume los valores true o false, es decir, habilita o deshabilita el fondo. Por defecto esta establecida como true.
En el caso de que el proveedor de datos nativo sea SQL Server ademas de las propiedades anteriores tendremos la propiedad Connection Reset: cada vez que utilizamos una conexion, SQL Server ejecuta en forma automatica un procedimiento almacenado que realiza ciertos controles para asegurarse que el contexto siga siendo el mismo, asi como tambien limpia la informacion en memoria que pueden crearse al utilizar las conexiones (tablas, variables, etc). Este control puede evitarse colocando esta propiedad en false, ya que esta verificacion consume recursos extra al tener que ejecutar dicho procedimiento, y en el caso de SQL Server 7.0, hace un viaje distinto hasta el servidor. Esta propiedad se encuentra en true por defecto, aunque podria eventualmente colocarse en false para poder liberar recursos, pero siempre y cuando estemos seguros que nuestra aplicacion no cambia el contexto de la conexion o que no utiliza tablas temporales u otros objetos en memoria. Es recomendable analizar con mucho detalle el uso de esta propiedad, ya que podriamos obetener resultados adversos en lugar de mejoras.
No hay comentarios:
Publicar un comentario