1

为什么 .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)”

在此处输入图像描述

4

1 回答 1

5

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位。

于 2012-07-16T19:54:56.753 回答