Список драйверов ODBC из .NET.

Есть ли способ получить список драйверов ODBC, установленных на компьютере под управлением Windows XP с .NET?

В основном я хотел бы видеть (в .NET), что есть:

Панель управления- > Административный Инструменты- > Источники данных (ODBC) → "Драйверы" Tab.

Ответы

Ответ 1

Смотрите этот или этот

В основном система хранит информацию драйвера ODBC здесь HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers

Вы можете использовать этот или похожий код, чтобы узнать установленные драйверы ODBC. Этот код в основном считывает информацию о драйверах из реестра

 public static List<String> GetSystemDriverList()
        {
            List<string> names = new List<string>();
            // get system dsn's
            Microsoft.Win32.RegistryKey reg = (Microsoft.Win32.Registry.LocalMachine).OpenSubKey("Software");
            if (reg != null)
            {
                reg = reg.OpenSubKey("ODBC");
                if (reg != null)
                {
                    reg = reg.OpenSubKey("ODBCINST.INI");
                    if (reg != null)
                    {

                        reg = reg.OpenSubKey("ODBC Drivers");
                        if (reg != null)
                        {
                            // Get all DSN entries defined in DSN_LOC_IN_REGISTRY.
                            foreach (string sName in reg.GetValueNames())
                            {
                                names.Add(sName);
                            }
                        }
                        try
                        {
                            reg.Close();
                        }
                        catch { /* ignore this exception if we couldn't close */ }
                    }
                }
            }

            return names;
        }

Ответ 2

Нет необходимости открывать каждый промежуточный подраздел. Чтение раздела реестра для получения имен драйверов ODBC может быть выполнено гораздо более компактным образом следующим образом:

    /// <summary>
    /// Gets the ODBC driver names from the registry.
    /// </summary>
    /// <returns>a string array containing the ODBC driver names, if the registry key is present; null, otherwise.</returns>
    public static string[] GetOdbcDriverNames()
    {
        string[] odbcDriverNames = null;
        using (RegistryKey localMachineHive = Registry.LocalMachine)
        using (RegistryKey odbcDriversKey = localMachineHive.OpenSubKey(@"SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"))
        {
            if (odbcDriversKey != null)
            {
                odbcDriverNames = odbcDriversKey.GetValueNames();
            }
        }

        return odbcDriverNames;
    }

Вы также можете реализовать эту функцию, выполнив P/Invoke для SQLGetInstalledDriversW:

    [DllImport("odbccp32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern bool SQLGetInstalledDriversW(char[] lpszBuf, ushort cbufMax, out ushort pcbBufOut);

    /// <summary>
    /// Gets the ODBC driver names from the SQLGetInstalledDrivers function.
    /// </summary>
    /// <returns>a string array containing the ODBC driver names, if the call to SQLGetInstalledDrivers was successfull; null, otherwise.</returns>
    public static string[] GetOdbcDriverNames()
    {   
        string[] odbcDriverNames = null;
        char[] driverNamesBuffer = new char[ushort.MaxValue];
        ushort size;

        bool succeeded = SQLGetInstalledDriversW(driverNamesBuffer, ushort.MaxValue, out size);

        if (succeeded == true)
        {
            char[] driverNames = new char[size - 1];
            Array.Copy(driverNamesBuffer, driverNames, size - 1);
            odbcDriverNames = (new string(driverNames)).Split('\0');
        }

        return odbcDriverNames;
    }

Я также вызываю функцию и использую результаты следующим образом, чтобы изящно деградировать предыдущие версии драйвера SQL при создании источников данных ODBC:

    /// <summary>
    /// Gets the name of an ODBC driver for Microsoft SQL Server giving preference to the most recent one.
    /// </summary>
    /// <returns>the name of an ODBC driver for Microsoft SQL Server, if one is present; null, otherwise.</returns>
    public static string GetOdbcSqlDriverName()
    {
        List<string> driverPrecedence = new List<string>() { "SQL Server Native Client 11.0", "SQL Server Native Client 10.0", "SQL Server Native Client 9.0", "SQL Server" };
        string[] availableOdbcDrivers = GetOdbcDriverNames();
        string driverName = null;

        if (availableOdbcDrivers != null)
        {
            driverName = driverPrecedence.Intersect(availableOdbcDrivers).FirstOrDefault();
        }

        return driverName;
    }