我正在寻找一种适当的抽象方法来从 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/

10-12 17:40