Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 通过ODBC从C#读取Netezza数据库表在Windows 7中不起作用_.net_Registry_Odbc_64 Bit_Netezza - Fatal编程技术网

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

.net 通过ODBC从C#读取Netezza数据库表在Windows 7中不起作用,.net,registry,odbc,64-bit,netezza,.net,Registry,Odbc,64 Bit,Netezza,为什么.NET不能通过安装的{NetezzaSQL}驱动程序连接到我的Netezza盒?64位应用程序也无法通过此ODBC连接进行连接。为什么会这样?我在“控制面板”中构建了用户和系统Netezza ODBC连接,当我单击“测试连接”时,两者都可以正常工作?我在注册表中看到该值,但当我遍历注册表驱动程序时,.NET没有看到“NetezzaSQL”。根据Netezza的说法,他们没有64位ODBC驱动程序。他们提供的驱动程序应该适用于32位和64位应用程序。这可能是Windows 7的权限问题吗

为什么.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();
}    
publicstaticvoid GetSystemDriverList()
{
//列表名称=新列表();
//获取系统dsn的
Microsoft.Win32.RegistryKey reg=(Microsoft.Win32.Registry.LocalMachine).OpenSubKey(“软件”);
如果(reg!=null)
{
reg=reg.OpenSubKey(“ODBC”);
如果(reg!=null)
{
reg=reg.OpenSubKey(“ODBCINST.INI”);
如果(reg!=null)
{
reg=reg.OpenSubKey(“ODBC驱动程序”);
如果(reg!=null)
{
//获取在\u注册表中的DSN\u LOC\u中定义的所有DSN条目。
foreach(reg.GetValueNames()中的字符串sName)
{
控制台写入线(sName);
//名称。添加(sName);
}
}
尝试
{
注册关闭();
}
catch{/*如果无法关闭*/},请忽略此异常
}
}
}
Console.ReadLine();
}    

这是我在使用用户ODBC连接时从Windows 7框中从Microsoft Access 2007获得的连接错误。系统1不可见

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


微软从未重命名过他们的“system32”文件夹,因此system32实际上拥有所有64位驱动程序。SysWow64文件夹具有所有32位驱动程序。默认情况下,在VisualStudio2010中创建的.NET项目的“目标平台”为x86。我刚刚将其更改为x64,我的连接使我的64位NetezzaSQL驱动程序能够为.NET工作

只需了解,通过在C:\Windows\system32\文件夹(这是用于构建64位驱动程序的对话框的64位版本)或C:\Windows\SysWow64\文件夹中运行“odbcad32.exe”文件,可以在“控制面板”>“管理工具”下启动ODBC(数据源)对话框(这是用于构建32位驱动程序的32位/x86版本的对话框)。是的,文件夹是反向的,因为Microsoft这样做很奇怪

此外,注册表中还生成了两个不同的文件夹。上面的列表(在我的黑屏截图中)来自计算机\HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\ODBC\list,因为它们是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只有一个,显然两者都有。我尝试在syswow6432节点中手动构建一个32位驱动程序(在run>regedit下)并指向驱动程序文件和安装文件(在system32文件夹中,但我遇到了一个错误。请注意,Windows中是否有方法自动安装为32位,而不是64位。

Microsoft从未重命名其“system32”文件夹,所以system32实际上拥有所有的64位驱动程序。SysWow64文件夹拥有所有的32位驱动程序。默认情况下,在Visual Studio 2010中创建的.NET项目的“目标平台”为x86。我刚刚将其更改为x64,我的连接使我的64位NetezzaSQL驱动程序为.NET工作

只需了解,通过在C:\Windows\system32\文件夹(这是用于构建64位驱动程序的对话框的64位版本)或C:\Windows\SysWow64\文件夹中运行“odbcad32.exe”文件,可以在“控制面板”>“管理工具”下启动ODBC(数据源)对话框(这是用于构建32位驱动程序的32位/x86版本的对话框)。是的,文件夹是反向的,因为Microsoft这样做很奇怪

此外,注册表中还生成了两个不同的文件夹。上面的列表(在我的黑屏截图中)来自计算机\HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\ODBC\list,因为它们是32位驱动程序。我安装的dll是“nzodbcsetup.exe”,显然是作为64位驱动程序安装的。我不确定如何在64位windows上作为32位驱动程序安装,因此我更改了“目标平台”在我的.NET项目中,从默认的x86到x64。必须有一种方法将其作为32位驱动程序安装,因为当我在32位Windows XP设备上安装此驱动程序时,该驱动程序运行良好

魏是什么