Vous pouvez appeler la SQLDataSources-fonction 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);
}
Exemple répertoriant les sources de données:
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);
}
}
}
Le premier appel à SQLDataSources avec SQL_FETCH_FIRST_SYSTEM
indique la fonction pour démarrer la la liste avec les DSN système. Si vous avez simplement commencé avec SQL_FETCH_NEXT
, il faudrait d'abord lister les pilotes. Link to the function ref on Microsofts site
Edit:
Tout le monde semble le savoir, mais je viens de découvrir hier quand je le code dans une nouvelle poject: si vous compilez cela avec VS sur un Windows 64 bits, vous devez définir la « plate-forme cible "à" x86 "ou le code ne sera pas exécuté.
Super réponse. J'ai dû rechercher SQL_FETCH_FIRST_USER pour le faire fonctionner dans mon environnement, mais c'était trivial. À votre santé. –
@Stephan Keller pouvez-vous s'il vous plaît m'aider avec la fonction sqlgetinfo dans C# – Arshad
@Arshad: Désolé, je n'ai jamais eu besoin d'utiliser SQLGetInfo, donc je n'ai pas d'implémentation pour cela. –