我正在寻找一种适当的抽象方法来从 C# 系统中获取 ODBC 数据源列表。我已经尝试了“在注册表中搜索”技巧,我发现它在英语中效果很好:
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()
唯一的问题是,我至少在一台西类牙语机器上发现他们的注册表项是西类牙语,所以显然违反这种抽象(如果存在)已经让我陷入困境。
有没有库函数可以做到这一点?
最佳答案
您可以在 ODBC32.DLL 中调用 SQLDataSources 函数:
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);
}
列出数据源的示例:
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);
}
}
}
第一次使用
SQL_FETCH_FIRST_SYSTEM
调用 SQLDataSources 告诉函数以 System-DSN 开始列表。如果您只是从 SQL_FETCH_NEXT
开始,它将首先列出驱动程序。 Link to the function ref on Microsofts site编辑:
每个人似乎都知道这一点,但我昨天刚刚在一个新项目中使用此代码时才发现:如果您在 64 位 Windows 上使用 VS 进行编译,则必须将“目标平台”设置为“x86”,否则代码将获胜不跑。
关于c# - 在 C# 中列出 ODBC 数据源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/562016/