通过ODBC在C#中读取Netezza数据库表在Windows 7中不起作用

Mac*_*ver 1 .net registry 64-bit odbc netezza

为什么.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在新选项卡中打开以查看ODBC的注册表设置并放大:

在此输入图像描述

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

7/13/2012 4:56 pm更新:

显然,驱动程序名称位于大括号内.当我以编程方式获得驱动程序列表时,我看不到驱动程序.如何在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();
}    
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

以下是我使用用户ODBC连接时从Windows 7框中从Microsoft Access 2007获得的连接错误.系统一个不可见.

错误:"ODBC - 调用失败.[Microsoft] [ODBC驱动程序管理器]指定的DSN包含驱动程序和应用程序(#0)之间的体系结构不匹配"

在此输入图像描述

Mac*_*ver 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\list,因为它们是32位驱动程序.我安装的DLL,"nzodbcsetup.exe",显然安装为64位驱动程序.我不确定如何在64位窗口上安装这个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位.