Estoy trabajando en una aplicación que requiere que el usuario introduzca una cadena de conexión. ¿Qué opciones tengo?
1 – Poner una caja de texto y dar por hecho que el usuario conoce todas las claves que puede utilizar en la cadena, y se desenvuelve tranquilamente en el infierno de las cadenas de conexión.
2 – Poner la caja de texto anterior, y al lado un enlace a http://www.connectionstrings.com/
3 – Usar el diálogo que viene incluido en la api de OLEDB.
4- Usar el diálogo que usa el visual studio 2005 en la pestaña de servidores.
4 – Crear un archivo con la extensión udl y ejecutarlo con System.Diagnostics.Process.Start(nombreFichero)
Vamos a ver como se implementan opción 3 y 4, que son las interesantes.
Opción 3:
Este diálog es el que ofrece la API de OLEDB. La pega que tiene es que no es código administrado y no está pensado para ser usado con ADO.net.
Los providers que se muestran no son los que admite el modelo de datos de .net, y de echo, la clave provider generada por este diálogo, no es admitida por los providers de SQL y Oracle.
Vamos, que hay que usarlo, pero con cuidado.
Pasos para usarlo:
1º – Agregar al proyecto referencias a los objetos COM Microsoft ActiveX Data Objects 2.x Library y OLE DB Service Component 1.0 Type Library.
2º – Para mostrar el diálogo para generar una nueva cadena de conexión, usar este código:
// Crear referencia e instancia del diálogo MSDASC.DataLinks mydlg = new MSDASC.DataLinks(); // Mostrar el diálogo y referenciar la conexión ADO devuelta ADODB._Connection ADOcon = (ADODB._Connection) mydlg.PromptNew(); // Si se ha generado correctamente una coneción ADO... if (ADOcon != null) { // Mostramos su connectionString en // la caja de texto txtConnectionString.Text = ADOcon.ConnectionString; }
3º – Para mostrar el diálogo en modo edición, usar este otro:
// Crear referencia e instancia del diálogo MSDASC.DataLinks mydlg = new MSDASC.DataLinks(); // Crear un objeto ADO Connection ADODB.ConnectionClass conn = new ADODB.ConnectionClass(); // Plantarle la cadena de conexión conn.ConnectionString = txtConnectionString.Text; // Crear una instancia de tipo Object de la conexión // para poder pasarla por referencia al diálogo object oConn = (object)conn; // Mostrar el diálogo bool result = mydlg.PromptEdit(ref oConn); // Si OK... if (result) { // Mostramos la ConnectionString del objeto ADO // en la caja de texto txtConnectionString.Text = conn.ConnectionString; }
Dejo por aquí este snippet que uso para eliminar la clave Provider de una ConnectionString. Puede venir bien.
using System.Data.Common; private string RemoveProviderKey(string connectionString) { // DBConnectionStringBuilder es una clase de System.Data.Common que // viene estupendamente para tratar cadenas de conexión DbConnectionStringBuilder csb = new DbConnectionStringBuilder(); csb.ConnectionString = connectionString; // Eliminamos la clave "Provider" csb.Remove("Provider"); // Devolvemos lo que queda return csb.ConnectionString; }
Opción 4:
Este diálogo se encuentra en el ensamblado Microsoft.Data.ConnectionUI.Dialog.dll ubicado en la carpeta [Archivos de programa]\Microsoft Visual Studio 8\Common7\IDE\.
El inconveniente de usar este diálogo, es que este archivo es propiedad de Microsoft y no es redistribuible, con lo cual sólo podríamos usarlo en aplicaciones en las que sepamos que se encuentra instalado este componente (Este inconveniente siempre puede ser resuelto con el Reflector)
La ventaja, es que este componente es 100% código administrado es un ensamblado de .net y está pensado pas ser usado con ADO.net. De hecho, lo primero que seleccionamos antes de generar la cadena de conexión, es el proveedor que queremos utilizar.
Pues eso, al lío.
1º – Añadir la referencia a Microsoft.Data.ConnectionUI.Dialog.dll en la ruta antes mencionada.
2º – Hacer un using de Microsoft.Data.ConnectionUI
3º – Usar el siguiente código:
// Instanciamos el diálogo... // Hacemos using, porque es necesario hacer un dispose al final using (DataConnectionDialog dlg = new DataConnectionDialog()) { // Cargar en el diálogo los providers disponibles en el sistema DataSource.AddStandardDataSources(dlg); // Mostrar el diálogo if (DataConnectionDialog.Show(dlg) == DialogResult.OK) { // Aquí asignaríamos dlg.ConnectionString a nuestra caja de texto MessageBox.Show(dlg.ConnectionString); } }
Si preferimos mostrar el diálogo de edición usamos el mismo código, con algunas modificaciones:
// Instanciamos el diálogo... // Hacemos using, porque es necesario hacer un dispose al final using (DataConnectionDialog dlg = new DataConnectionDialog()) { // Cargar en el diálogo los providers disponibles en el sistema DataSource.AddStandardDataSources(dlg); // Indicar el DataSource dlg.SelectedDataSource = DataSource.SqlDataSource; // Indicar cuál sera el provider a usar // En este caso usaremos SQL Server dlg.SelectedDataProvider = DataProvider.SqlDataProvider; // la cadena que vayamos a editar // Lo suyo sería asignar el valor contenido en nuestra // caja de texto dlg.ConnectionString = "Server=myServerAddress;" + "Database=myDataBase;Uid=myUsername;Pwd=myPassword;"; // Mostrar el diálogo if (DataConnectionDialog.Show(dlg) == DialogResult.OK) { // Aquí asignaríamos dlg.ConnectionString a nuestra caja de texto MessageBox.Show(dlg.ConnectionString); } }
Referencias:
http://www.mztools.com/articles/2007/mz2007011.aspx
http://support.microsoft.com/kb/286189/EN-US/
Crossposted from crisfervil.com