2010-06-21 16 views
6

Sto utilizzando OleDB DataReader per ottenere dati dai miei file excel (ma questo problema si verifica anche in DataTable.Fill). Il fatto è che ho una colonna che dovrebbe restituire stringhe. Tutto va bene e funziona, ma di recente è emerso un problema, perché le celle della colonna avevano formati diversi. Alcuni erano in numeri e altri in testo. Quando ho controllato usando dataReader.GetSchema() ha mostrato che la colonna in questione era stata dedotta come tipo System.String. Il problema con questo era che tutte le celle non di testo erano immediatamente impostate su null.Problema di formattazione cella Excel

C'è un modo per suggerire al lettore che quella colonna deve solo analizzare le colonne come System.Object invece di dedurlo come System.String e scaricare tutte le celle non stringa?

La stringa di connessione che sto utilizzando è:

stringa connString = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Origine dati =" + filePath + ";" + "Proprietà estese = Excel 8.0;";

e il codice è:

using (OleDbConnection connection = new OleDbConnection(connString)) 
{ 
    connection.Open(); 
    foreach (string worksheetName in worksheetNames) 
    { 
     using (OleDbCommand command = 
      new OleDbCommand("SELECT * FROM [" + worksheetName + "]", connection)) 
     { 
      TEntity entity; 
      using (OleDbDataReader dataReader = command.ExecuteReader()) 
      { 
       while (dataReader.Read()) 
       { 
        entity = GetDataFromDataTable(dataReader); 

        if (entity != null) 
        { 
         entityList.Add(entity); 
        } 
       } 
      } 
     } 
    } 
    connection.Close(); 
} 

risposta

7

È necessario aggiungere IMEX o MAXSCANROWS alla stringa di connessione.

MAXSCANROWS - Il numero di righe da scansionare per determinare il tipo di dati di ciascuna colonna. Il tipo di dati viene determinato in base al numero massimo di tipi di dati trovati. Se vengono rilevati dati che non corrispondono al tipo di dati indovinato per la colonna, il tipo di dati verrà restituito come valore NULL.

Per il driver Microsoft Excel, è possibile immettere un numero da 1 a 16 per le righe da sottoporre a scansione. Il valore predefinito è 8; se è impostato su 0, tutte le righe vengono scansionate. (Un numero al di fuori del limite restituirà un errore.)

Inoltre, controllare il [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel] registro individuato REG_DWORD "TypeGuessRows". Questa è la chiave per non consentire a Excel di utilizzare solo le prime 8 righe per indovinare il tipo di dati delle colonne. Impostare questo valore su 0 per eseguire la scansione di tutte le righe. Questo potrebbe danneggiare le prestazioni.

+0

Grazie. IMEX ha funzionato. – Jonn

+0

FYI: MaxScanRows = 0 viene ignorato quando si utilizza il provider Microsoft.Jet.OLEDB.4.0; esegue ancora solo la scansione delle prime 8 righe. Il provider Microsoft.ACE.OLEDB.12.0 non sembra soffrire dello stesso problema. Vedere la sezione su _Rows to Scan_ in [KB] (http://support.microsoft.com/default.aspx?scid=kb;en-us;257819) – codechurn

2

due cose che vengono in mente:

  1. Che tipo è 'TEntity'. È limitato alle stringhe o ad un altro tipo?

  2. Che tipo di elenco è EntityList. È generico o è un elenco (di TEntity) o qualche altro tipo?

+0

TEntity è un tipo generico – Jonn

Problemi correlati