origenes origen exportar datos crear configurar conexion cadena archivo c# odbc

c# - crear - exportar origenes de datos odbc



Listado de orĂ­genes de datos ODBC en C# (4)

No creo que haya nada en .NET, y una comprobación rápida de la API ODBC (nativa) muestra algunas funciones que pueden ser de ayuda:

  • SQLBrowseConnec
  • SQLDrivers

Debido a la forma en que se utilizan los búferes en la API de ODBC, será necesario fijar cuidadosamente las matrices de caracteres.

Estoy buscando una forma correctamente abstracta de obtener una lista de fuentes de datos ODBC del sistema en C #. Probé el truco de "hurgando en el registro", que encontré que funciona bien en inglés:

RegistryKey reg = (Registry.CurrentUser).OpenSubKey("Software"); reg = reg.OpenSubKey("ODBC"); reg = reg.OpenSubKey("ODBC.INI"); reg = reg.OpenSubKey("ODBC Data Sources"); and then, of course, iterating over reg.GetValueNames()

El único problema es que descubrí en al menos una máquina española que sus claves de registro están, bueno, en español, por lo que violar claramente esta abstracción (si existe) ya me ha metido en problemas.

¿Hay una función de biblioteca para hacer esto?


Si está utilizando una aplicación de Windows Forms (no un entorno web), puede usar el cuadro de diálogo "Elegir origen de datos" de Visual Studio.

Está incluido en un ensamblaje y se puede usar fácilmente.

El artículo donde encontré esta información: http://www.mztools.com/articles/2007/MZ2007011.aspx

En cualquier caso, soy de España y también uso la solución de registro (especialmente en aplicaciones web). Nunca encontré una máquina con esas entradas en un idioma diferente al inglés.

Espero ser de ayuda ...


Uso el siguiente código para recuperar los DSN del registro:

private List<string> EnumDsn() { List<string> list = new List<string>(); list.AddRange(EnumDsn(Registry.CurrentUser)); list.AddRange(EnumDsn(Registry.LocalMachine)); return list; } private IEnumerable<string> EnumDsn(RegistryKey rootKey) { RegistryKey regKey = rootKey.OpenSubKey(@"Software/ODBC/ODBC.INI/ODBC Data Sources"); if (regKey != null) { foreach (string name in regKey.GetValueNames()) { string value = regKey.GetValue(name, "").ToString(); yield return name; } } }

Es extraño que tengas un nombre no inglés para la clave "Fuentes de datos ODBC" ... Tengo una versión francesa de Windows, y el nombre todavía está en inglés


Puede llamar a la función SQLDataSources en ODBC32.DLL:

using System.Runtime.InteropServices; public static class OdbcWrapper { [DllImport("odbc32.dll")] public static extern int SQLDataSources(int EnvHandle, int Direction, StringBuilder ServerName, int ServerNameBufferLenIn, ref int ServerNameBufferLenOut, StringBuilder Driver, int DriverBufferLenIn, ref int DriverBufferLenOut); [DllImport("odbc32.dll")] public static extern int SQLAllocEnv(ref int EnvHandle); }

Ejemplo que enumera las fuentes de datos:

public void ListODBCsources() { int envHandle=0; const int SQL_FETCH_NEXT = 1; const int SQL_FETCH_FIRST_SYSTEM = 32; if (OdbcWrapper.SQLAllocEnv(ref envHandle) != -1) { int ret; StringBuilder serverName = new StringBuilder(1024); StringBuilder driverName = new StringBuilder(1024); int snLen = 0; int driverLen = 0; ret = OdbcWrapper.SQLDataSources(envHandle, SQL_FETCH_FIRST_SYSTEM, serverName, serverName.Capacity, ref snLen, driverName, driverName.Capacity, ref driverLen); while (ret == 0) { System.Windows.Forms.MessageBox.Show(serverName + System.Environment.NewLine + driverName); ret = OdbcWrapper.SQLDataSources(envHandle, SQL_FETCH_NEXT, serverName, serverName.Capacity, ref snLen, driverName, driverName.Capacity, ref driverLen); } } }

La primera llamada a SQLDataSources con SQL_FETCH_FIRST_SYSTEM le dice a la función que comience la lista con los DSN del sistema. Si simplemente comenzó con SQL_FETCH_NEXT , primero debería enumerar los controladores. Enlace a la función ref en el sitio de Microsofts

Editar:
Todo el mundo parece saberlo, pero ayer lo descubrí cuando utilicé este código en un nuevo proyecto: si estás compilando esto con VS en un Windows de 64 bits, debes establecer la "Plataforma de destino" en "x86" o el código obtenido. no corras