Чтение таблицы базы данных Netezza из C# через ODBC не работает в Windows 7

Почему.NET не может подключиться к моей коробке Netezza через установленный драйвер {NetezzaSQL}? 64-разрядные приложения также не могут подключаться через это соединение ODBC. С чего бы это? Я построил как пользовательские, так и системные подключения Netezza ODBC на панели управления, и оба работают нормально, когда я нажимаю "Проверить подключение"? Я вижу значение в реестре, но когда я просматриваю драйверы реестра, .NET не видит "NetezzaSQL". По словам Netezza, у них нет 64-битного драйвера ODBC. Драйвер, который они предоставляют, должен работать для 32- и 64-битных приложений. Может ли это быть проблема с разрешениями, возможно, с Windows 7?

static void CreateNetezzaTableObjectFolders()
{
    //string activeDir = @"C:\Source\EDW\dw-objects\trunk";

    OdbcConnection conn = new OdbcConnection();
    conn.ConnectionString = "Driver={NetezzaSQL};servername=10.1.170.18;port=5480;database=DEV_SANDBOX; username=mac;password=secret;";

    OdbcDataReader rdr = null;

    try
    {
        conn.Open();
        System.Data.Odbc.OdbcCommand cmd = new System.Data.Odbc.OdbcCommand("SELECT OBJECT_NAME FROM QA_ETL..STG_OBJECTS", conn);
        rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            Console.WriteLine(rdr[0]);
            // Create Folder
            //string objectName = rdr[0].ToString();
            //string newPath = System.IO.Path.Combine(activeDir, objectName);
            //System.IO.Directory.CreateDirectory(newPath);
        }
    }
    finally
    {
        // close the reader
        if (rdr != null)
        {
            rdr.Close();
        }

        // close the connection
        if (conn != null)
        {
            conn.Close();
        }
    }
}

Откройте в новой вкладке, чтобы увидеть настройки реестра для ODBC и увеличить:

============================

13/2012/ 16:56 обновление:

Видимо, имя водителя идет внутри фигурных скобок. Когда я получаю список драйверов программно, я не вижу драйвер. Как мне добавить этот список в пользовательский интерфейс Windows? Однако я вижу установленный драйвер Netezza в Панели управления> Администрирование> Драйверы ODBC.

Вот некоторый код, который подтверждает то, что я объясняю:

public static void 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())
                    {
                        Console.WriteLine(sName);
                        //names.Add(sName);
                    }
                }
                try
                {
                    reg.Close();
                }
                catch { /* ignore this exception if we couldn't close */ }
            }
        }
    }

    Console.ReadLine();
}    

Вот ошибка соединения, которую я получаю из Microsoft Access 2007 из окна Windows 7, когда я использую пользовательское соединение ODBC. Система одна не была видна.

Ошибка: "ODBC- сбой вызова. [Microsoft][Диспетчер драйверов ODBC] Указанный DSN содержит несоответствие архитектуры между драйвером и приложением (#0)"

1 ответ

Решение

Microsoft никогда не переименовывала их папку "system32", поэтому system32 действительно имеет все 64-битные драйверы. И папка SysWow64 имеет все 32-битные драйверы. По умолчанию проект.NET, созданный в Visual Studio 2010, будет иметь "Целевую платформу" x86. Я просто изменил его на x64, и мое соединение заработало, чтобы мой 64-битный драйвер NetezzaSQL работал на.NET.

Просто поймите, что вы можете запустить диалог ODBC (Источники данных) в Панели управления> Администрирование, запустив файл "odbcad32.exe" в папке C:\Windows\system32\ (это 64-битная версия диалога для построить 64-битные драйверы) или в папке C:\Windows\SysWow64\ (это 32-битная /x86 версия диалога для создания 32-битных драйверов). Да, папки поменялись местами, потому что Microsoft странная в этом смысле.

Кроме того, в реестре есть две разные папки, которые создаются. Оказывается, что приведенный выше список (на моем черном снимке экрана) взят из списка Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\, потому что это 32-битные драйверы. Установленная мной dll, "nzodbcsetup.exe", очевидно, установлена ​​как 64-битный драйвер. Я не совсем уверен, как установить это как 32-битный драйвер в 64-битных окнах, поэтому я изменил "Целевую платформу" в моем.NET-проекте с версии по умолчанию x86 на x64. Должен быть способ установить его как 32-разрядный драйвер, потому что когда я устанавливал его на 32-разрядную версию Windows XP, драйвер работал нормально.

Что странно, так это то, что OLE-драйверы Netezza разделены. У них есть 32-битный и 64-битный исполняемый файл dll (для версии 6.0.3). "nzoledbsetup.exe" (~82 МБ x86) и "nzoledbsetup64.exe" (~102 МБ x64). Но у ODBC есть только один, по-видимому, оба. Я попытался вручную создать 32-разрядный драйвер в SysWOW6432Node (в разделе run > regedit) и указал на файл драйвера и файл установки (в папке system32, но я получил ошибку. Прокомментируйте, пожалуйста, есть ли в Windows способ автоматической установки как 32 бита, а не 64.

Другие вопросы по тегам