Чтение таблицы базы данных 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.