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

问题描述:

为什么.NET不能通过安装的{NetezzaSQL}驱动程序连接到我的Netezza框? 64位应用程序也无法通过此ODBC连接进行连接。为什么会这样?我已经在控制面板中建立了用户和系统Netezza ODBC连接,并且当我点击“测试连接”时,两者都可以正常工作?我看到注册表中的值,但是当我遍历注册表驱动时,.NET看不到“NetezzaSQL”。根据Netezza的说法,他们没有64位ODBC驱动程序。他们提供的驱动程序应该适用于32位和64位应用程序。这可能是Windows 7的权限问题吗?从C#通过ODBC读取Netezza数据库表在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和放大:

enter image description here

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

7/13/2012下午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(); 
}  

enter image description here

这里是连接错误,我从微软Access 2007年从Windows 7箱送,当我使用的用户ODBC连接。该系统不可见。

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

enter image description here

+0

连接字符串看起来很好:http://www.connectionstrings.com/netezza – 2012-07-13 21:00:53

+0

请确切的错误信息是什么? – dash 2012-07-13 21:13:13

+0

错误[IM002] [Microsoft] [ODBC Driver Manager]数据源名称未找到并且未指定默认驱动程序 – MacGyver 2012-07-13 21:22:28

微软从未改名他们的“system32”文件夹,所以system32真的拥有所有的64位驱动程序。和SysWow64文件夹具有所有的32位驱动程序。默认情况下,在Visual Studio 2010中创建的.NET项目将具有x86的“目标平台”。我只是将其更改为x64,并且我的连接可以让我的64位NetezzaSQL驱动程序在.NET上工作。

只需要在C:\ Windows \ system32 \文件夹中运行“odbcad32.exe”文件(这是64位版本),即可启动控制面板>管理工具下的ODBC(数据源)对话框的对话框来构建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(在运行> regedit下)手动构建一个32位驱动程序,并指向驱动程序文件和安装文件(位于system32文件夹中,但出现错误。请评论是否有一种方法可以在Windows中自动安装为32位,而不是64.

+0

第二次完成此操作后,我注意到安装程序提供了x86和x64版本的驱动程序选项在64位Windows(7或Server 2008)上,32位版本显然是该程序的一部分实际在应用程序设置为x86时使用(在Visual Studio项目属性中)。这显然是SysWOW64文件夹中的驱动程序。 – MacGyver 2012-09-24 22:19:01

+0

另一个非常好的解释:http://community.qlik.com/blogs/qlikviewdesignblog/2014/02/10/odbc-confusion – MacGyver 2014-07-15 18:39:16