2012-07-13 43 views
1

爲什麼.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

回答

5

微軟從未改名他們的「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

相關問題