通过 ODBC 从 C# 读取 Netezza 数据库表在 Windows 7 中不起作用
Posted
技术标签:
【中文标题】通过 ODBC 从 C# 读取 Netezza 数据库表在 Windows 7 中不起作用【英文标题】:Reading Netezza database table from C# via ODBC not working in Windows 7 【发布时间】:2012-07-13 20:56:51 【问题描述】:为什么 .NET 不能通过已安装的 NetezzaSQL 驱动程序连接到我的 Netezza 机器? 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 的注册表设置并放大:
=============================
2012 年 7 月 13 日下午 4:56 更新:
显然,驱动程序名称位于大括号内。当我以编程方式获取驱动程序列表时,我看不到驱动程序。如何在 Windows 用户界面中添加到此列表?但是,我确实可以在“控制面板”>“管理工具”>“ODBC 驱动程序”下查看已安装的 Netezza 驱动程序。
这里有一些代码可以验证我正在解释的内容:
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();
这是我在使用用户 ODBC 连接时从 Windows 7 框中的 Microsoft Access 2007 得到的连接错误。系统一不可见。
错误:“ODBC--调用失败。[Microsoft][ODBC Driver Manager] 指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配 (#0)”
【问题讨论】:
连接字符串看起来不错:connectionstrings.com/netezza 请问具体的错误信息是什么? 错误 [IM002] [Microsoft][ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序 ServerVersion = 'conn.ServerVersion' 引发了“System.InvalidOperationException”类型的异常 【参考方案1】:Microsoft 从未重命名他们的“system32”文件夹,因此 system32 确实拥有所有 64 位驱动程序。 SysWow64 文件夹包含所有 32 位驱动程序。默认情况下,在 Visual Studio 2010 中创建的 .NET 项目将具有 x86 的“目标平台”。我刚刚将其更改为 x64,我的连接使我的 64 位 NetezzaSQL 驱动程序适用于 .NET。
只需意识到您可以通过在 C:\Windows\system32\ 文件夹中运行“odbcad32.exe”文件来启动控制面板 > 管理工具下的 ODBC(数据源)对话框(这是 64 位版本的用于构建 64 位驱动程序的对话框),或在 C:\Windows\SysWow64\ 文件夹中(这是用于构建 32 位驱动程序的对话框的 32 位/x86 版本)。是的,这些文件夹被颠倒了,因为微软的这种方式很奇怪。
此外,在注册表中构建了两个不同的文件夹。原来上面的列表(在我的黑色屏幕截图中)来自 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ 列表,因为这些是 32 位驱动程序。我安装的 dll,“nzodbcsetup.exe”,显然是作为 64 位驱动程序安装的。我不确定如何在 64 位 Windows 上将其作为 32 位驱动程序安装,因此我将 .NET 项目中的“目标平台”从默认的 x86 更改为 x64。必须有一种方法将其安装为 32 位驱动程序,因为当我将它安装在 32 位 Windows XP 机器上时,驱动程序运行良好。
奇怪的是,Netezza 的 OLE 驱动程序是分开的。它们有一个 32 位和一个 64 位 dll exe 文件(适用于版本 6.0.3)。 “nzoledbsetup.exe”(~82MB x86)和“nzoledbsetup64.exe”(~102MB x64)。但是 ODBC 只有一个,显然两者兼而有之。我尝试在 SysWOW6432Node 中手动构建一个 32 位驱动程序(在运行 > regedit 下)并指向驱动程序文件和设置文件(在 system32 文件夹中,但我收到一个错误。请评论 Windows 中是否有一种方法可以自动安装为32 位,而不是 64。
【讨论】:
第二次执行此操作后,我注意到安装程序提供了 x86 和 x64 版本的驱动程序选项。在 64 位 Windows(7 或 Server 2008)上,当应用程序设置为 x86(在 Visual Studio 项目属性中)时,32 位版本显然是程序实际使用的版本。那显然是 SysWOW64 文件夹中的驱动程序。 另一个很好的解释:community.qlik.com/blogs/qlikviewdesignblog/2014/02/10/…以上是关于通过 ODBC 从 C# 读取 Netezza 数据库表在 Windows 7 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
无法从 C# VS2013 访问 IBM Netezza 服务器,但在 IBM Aginity 工作台中运行良好
Aginity for Netezza 使用 ODBC 从外部 xlsx 文件创建临时表
Netezza 是不是具有 ODBC DESCRIBE 函数?