2015-10-04 31 views
11

Sto riscontrando un problema con la connessione ODBC che si suppone possa connettersi a una tabella di Excel e utilizzarla. Ho già letto molte cose su internet, ma nessuna delle soluzioni mi ha aiutato (incluso lo stackoverflow).Errore di connessione ODBC a Excel

Quindi in pratica sono in un punto in cui sto cercando di aprire una connessione a un tavolo.

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; 
} 

Quando chiamo il metodo excel.Open(), ottengo OdbcException con il messaggio:

nome ERRORE [IM002] [Microsoft] [Gestione driver ODBC] Fonte dei dati non trovato e nessun driver predefinito specificato" , il che è strano perché ho quelle specificate nella stringa di nome con.

vale anche la pena di ricordare che in amministratore origine dati ODBC, Posso vedere chiaramente che ho quei driver installati e funzionanti.

C'è anche un'altra parte dispari. Quando chiamo il seguente metodo che ho trovato su StackOverflow mi restituisce il seguente elenco di driver:

  • "Driver da Microsoft para Arquivos Texto (* .txt; * .csv)"
  • "Driver fare Microsoft Access (* .mdb)"
  • "driver do Microsoft dBase (* .dbf)"
  • "driver do Microsoft Excel (*. xls)"
  • "driver do Microsoft Paradox (* DB)"
  • "Driver Microsoft Access (* .md b) "
  • "Microsoft Access-Treiber (* .mdb)"
  • "Driver Microsoft dBase (* .dbf)"
  • "Microsoft dBase-Treiber (* .dbf)"
  • " Microsoft Excel driver (* .xls) "
  • "Microsoft Excel-Treiber (* .xls)"
  • "Microsoft ODBC per Oracle"
  • "driver Microsoft Paradox (* DB)"
  • " Microsoft Paradox- Treiber (* .db) "
  • "Driver di testo Microsoft (.txt; .csv)"
  • "Microsoft Text-Treiber (* .txt; * .csv)"
  • "SQL Server"
  • "SQL Server Native Client 11.0"

Nessuno di quelli hanno il "* .xlsx" in loro, che è il formato di un file che sto cercando di leggere.

Il metodo è il seguente:

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; 
} 

Va notato che quando ho effettivamente vado al regedit e trovare quei valori vedo chiaramente:

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

Mi sto perdendo qualcosa di ovvio? Per favore aiutatemi :)

A proposito, sono abbastanza nuovo su questo lato di .NET quindi per favore mantieni le risposte senza parole in modo da poter effettivamente capire cosa sta succedendo. Grazie!

EDIT: Un amico ha sottolineato che dovrei dare maggiori informazioni, ecco lo screenshot del regedit, Amministratore origine dati ODBC e la prova che l'ACEODBC.DLL esiste realmente sul mio disco rigido:

additional_info

anche il con.ToString() ha pronunciato la seguente:

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

Non capisco davvero perché la gente picchia. Usa 'microsoft.ace.oledb' per lavorare con Excel –

+0

@ T.S. Grazie per l'idea. Ci proverò sicuramente ad un certo punto, ma sono ancora curioso del perché questo non funziona. – AbyPhantom

+0

@AbyPhantom: come indicato [qui] (http://stackoverflow.com/questions/31344178/saving-data-from-spss-to-excel-custom-sheet-name) nei commenti, potrebbe essere necessario avere compatibilità tra la versione bit di Office e l'applicazione che stai utilizzando per modificare il file excel (un po 'di noob a me stesso, quindi potrebbe non avere molto senso, ma ho lo stesso errore) –

risposta

1

assicurarsi di aver scaricato e installato il Microsoft Access Database Engine 2010 Redistributable ....

E modificare la stringa di connessione per ...

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=G:\POS\odabrane_skole novo_mod.xlsx;Extended Properties="Excel 12.0;HDR=YES; IMEX=1;"; 
1

Come sull'utilizzo OleDbConnection, e si deve installare Microsoft Access Database Engine 2010 in un primo momento.

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

I Sembra che l'applicazione sia un'applicazione x86 (32 bit) e si stia esaminando il driver ODBC a 64 bit. Verifica se il driver ODBC a 32 bit è installato ....