2015-10-04 242 views
11

我遇到了應該連接到Excel表的ODBC連接的問題,並使用它進行操作。我已經在網上閱讀了很多關於它的東西,但沒有一個解決方案對我有幫助(包括stackoverflow)。ODBC連接到Excel錯誤

所以基本上我在一個點,我試圖打開一個表的連接。

private static SortedList<string, School> generateSchoolListExcel(string listFilePath) 
{ 
    StringBuilder con = new StringBuilder(); 

    OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Data Source", listFilePath); 
    OdbcConnectionStringBuilder.AppendKeyValuePair(con, "HDR", "yes"); 
    OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Format", "xlsx"); 
    OdbcConnectionStringBuilder.AppendKeyValuePair(con, "Driver", "{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}"); 
    //I have tried to specify driver without parentheses {} but it's still the same 

    List<School> schoolList = new List<School>(); 

    using (OdbcConnection excel = new OdbcConnection(con.ToString())) 
    { 
     excel.Open(); 
     //doing actuall stuff 
    } 

     return schoolList; 
} 

當我打電話excel.Open()方法,我得到OdbcException與消息:

ERROR [IM002] [微軟] [ODBC驅動程序管理器]數據源名稱未 發現並沒有指定默認驅動程序」 ,這很奇怪,因爲我有 那些在字符串中指定的命名爲con。

還值得一提的是,在ODBC數據源管理器中,我可以清楚地看到,我已經安裝並運行了這些驅動程序。

還有一個奇怪的部分。當我把下面的方法我在計算器返回我的驅動程序下面的列表中發現:

  • 「司機達微軟對arquivos texto(* .TXT,* .CSV)」
  • 「驅動程序做的Microsoft Access(* .mdb)中」
  • 「驅動程序做的dBase微軟(* .DBF)」
  • 「驅動程序做的Microsoft Excel(* .xls)的」
  • 「驅動程序做微軟的Paradox(* .db的)」
  • 「Microsoft Access Driver(* .md B) 「
  • 」的Microsoft Access-二極管驅動器(* .mdb)中「
  • 」微軟dBase驅動程序(* .DBF)「
  • 」微軟的dBase-二極管驅動器(* .DBF)「
  • 」 Microsoft Excel中驅動器(* .xls) 「
  • 」微軟Excel的二極管驅動器(的* .xls)「
  • 」微軟ODBC的Oracle「
  • 」微軟Paradox驅動程序(* .db的)「
  • 」 微軟Paradox- Treiber(* .db)「
  • 「Microsoft Text Driver(.txt;的.csv)」
  • 「微軟文本二極管驅動器(* .TXT,* .CSV)」
  • 的 「SQL Server」
  • 「SQL服務器本機客戶端11.0」

無的那些在它們中有「* .xlsx」,這是我想要讀取的文件的格式。

的方法如下:

public static List<String> 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()) 
        { 
         names.Add(sName); 
        } 
       } 
       try 
       { 
        reg.Close(); 
       } 
       catch { /* ignore this exception if we couldn't close */ } 
      } 
     } 
    } 

    return names; 
} 

應當注意的是,當我真正去到regedit並找到這些值我清楚地看到:

"Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)". 

我失去了一些東西明顯?請幫助我:)

順便說一下,我很新的.NET的這方面,所以請保持你的答案愚蠢的,所以我可以真正理解發生了什麼事情。謝謝!

編輯: 有朋友指出我應該提供更多的信息,所以這裏是註冊表編輯器,ODBC數據源管理器的屏幕截圖,而且ACEODBC.DLL確實存在我的硬盤上的證據:

additional_info

另外,con.ToString()給出如下:

Data Source="G:\POS\odabrane_skole novo_mod.xlsx";Driver="{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}" 
+3

我真的不明白爲什麼人們在跳動自己。使用'microsoft.ace.oledb'來使用Excel –

+0

@ T.S。感謝這個想法。我肯定會嘗試一下,但我仍然很好奇爲什麼這不起作用。 – AbyPhantom

+0

@AbyPhantom:正如在評論中指出的[這裏](http://stackoverflow.com/questions/31344178/saving-data-from-spss-to-excel-custom-sheet-name),你可能需要有Office位版本和你用來修改excel文件的應用程序之間的兼容性(一個小我自己這個東西,所以這可能沒有多大意義,但我有同樣的錯誤) –

回答

1

如何使用的OleDbConnection,你必須先安裝Microsoft Access數據庫引擎2010。

string path = @"c:\sample.xlsx"; 
string strCon = " Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source = " + path + ";Extended Properties='Excel 12.0;'"; 
OleDbConnection objConn = new OleDbConnection(strCon); 

string strCom = " SELECT * FROM [a$] "; 
objConn.Open(); 
1

我看起來您的應用程序是x86(32位)應用程序,您正在查看64位ODBC驅動程序。檢查是否安裝了32位ODBC驅動程序....