通过 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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Netezza 与 C++ 的连接

无法从 C# VS2013 访问 IBM Netezza 服务器,但在 IBM Aginity 工作台中运行良好

Aginity for Netezza 使用 ODBC 从外部 xlsx 文件创建临时表

Netezza 是不是具有 ODBC DESCRIBE 函数?

用于 linux 的 Netezza odbc 驱动程序下载失败

是否可以在 Ubuntu 上使用 Netezza ODBC 驱动程序?