Se podría llamar la SQLDataSources-función 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 muestra los orígenes 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
indica a la función para iniciar el listado con los DSN del sistema. Si simplemente comenzó con SQL_FETCH_NEXT
, primero debería enumerar los controladores. Link to the function ref on Microsofts site
Editar:
Todo el mundo parece saber, pero me acabo de enterar ayer cuando utilicé este código en un nuevo poject: si está compilando esto con VS en un Windows de 64 bits que tiene que establecer la "Plataforma de destino "a" x86 "o el código no se ejecutará.
Awesome answer. Tuve que buscar SQL_FETCH_FIRST_USER para que funcionara en mi entorno, pero eso era trivial. Aclamaciones. –
@Stephan Keller me puede ayudar con la función sqlgetinfo en C# – Arshad
@Arshad: Lo siento, nunca tuve que usar SQLGetInfo, así que no tengo ninguna implementación para él. –