2010-06-21 23 views
6

J'utilise OleDB DataReader pour obtenir des données de mes fichiers Excel (mais ce problème se produit également dans DataTable.Fill). La chose est que j'ai une colonne qui devrait renvoyer des chaînes. Tout va bien et fonctionne mais récemment, un problème est survenu, car les cellules de la colonne avaient des formats différents. Certains étaient en nombre et d'autres en texte. Quand j'ai vérifié en utilisant dataReader.GetSchema() il a montré que la colonne en question était inférée comme type System.String. Le problème avec ceci était que toutes les cellules non-text étaient immédiatement mises à null. Y a-t-il un moyen de suggérer au lecteur que cette colonne doit simplement analyser les colonnes en tant que System.Object au lieu de déduire cela comme System.String et en vidant toutes les cellules non-string?Problème de formatage de cellule Excel

La chaîne de connexion J'utilise est:

chaîne connString = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Data Source =" + filePath + ";" + "Propriétés étendues = Excel 8.0;";

et le code est:

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

Répondre

7

Vous devez ajouter IMEX ou MAXSCANROWS à la chaîne de connexion.

MAXSCANROWS - Le nombre de lignes à analyser pour déterminer le type de données de chaque colonne. Le type de données est déterminé compte tenu du nombre maximum de types de données trouvées. Si des données ne correspondant pas au type de données détecté pour la colonne sont rencontrées, le type de données sera renvoyé en tant que valeur NULL.

Pour le pilote Microsoft Excel, vous pouvez entrer un nombre compris entre 1 et 16 pour les lignes à analyser. La valeur par défaut est 8; Si elle est définie sur 0, toutes les lignes sont analysées. (Un nombre en dehors de la limite retournera une erreur.)

De plus, consultez le registre REG_DWORD "TypeGuessRows" situé sous [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel]. C'est la clé pour ne pas laisser Excel utiliser seulement les 8 premières lignes pour deviner le type de données des colonnes. Définissez cette valeur sur 0 pour analyser toutes les lignes. Cela pourrait nuire à la performance.

+0

Merci. IMEX a travaillé. – Jonn

+0

FYI: le MaxScanRows = 0 est ignoré lors de l'utilisation du fournisseur Microsoft.Jet.OLEDB.4.0; il scanne seulement les 8 premières rangées. Le fournisseur Microsoft.ACE.OLEDB.12.0 ne semble pas souffrir du même problème. Voir la section sur _Rows to Scan_ dans le [KB] (http://support.microsoft.com/default.aspx?scid=kb;en-us;257819) – codechurn

2

Deux choses qui viennent à l'esprit:

  1. De quel type est 'TEntity'. Est-ce restreint à des cordes ou à un autre type?

  2. Quel type de liste est entityList. Est-ce générique, ou est-ce une liste (de TEntity), ou un autre type?

+0

TEntity est un type générique – Jonn