web-dev-qa-db-fra.com

Qu'est-ce que IMEX dans la chaîne de connexion OLEDB?

string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"

Salut. Quel est le but d'IMEX?

31
Dimitar Tsonev

De ConnectionStrings

"Si vous souhaitez lire les en-têtes de colonne dans le jeu de résultats (en utilisant HDR = NO même s’il existe un en-tête) et que les données de la colonne sont numériques, utilisez IMEX = 1 pour éviter un blocage.

Toujours utiliser IMEX = 1 est un moyen plus sûr de récupérer des données pour des colonnes de données mélangées. .. "

Veuillez noter que la valeur IMEX peut être très importante lorsque vous devez écrire des données dans Excel . Une recherche rapide sur Internet sur IMEX a permis de découvrir de nombreux articles sur les problèmes liés à diverses valeurs IMEX.

30
Steve

Il existe un problème potentiel lors de la lecture de fichiers Excel avec une connexion OleDbConnection. 

Si tu utilises 

  "Extended Properties='Excel 8.0;HDR=NO;IMEX=3;'"

pour une colonne comme celle-ci où les 8 premières lignes ont 4 (ou plus) valeurs numériques, alors le type est considéré numérique et les valeurs de chaîne sont lues comme nulles.

Notez que l'en-tête n'est pas utilisé ici (HDR = NO), la ligne "zipcode" est donc la première. (Ces codes postaux proviennent de Suède si vous ne reconnaissez pas leur format.)

 1) zipcode
 2) 125 45
 3) 115 50
 4) 18735
 5) 11335
 6) 13940
 7) 181 55
 8) 11759
 9) 176 74
10) 137 38

Mais si vos données ressemblent à ceci, où seulement 3 sont numériques des 8 premières lignes

 1) zipcode
 2) 125 45
 3) 115 50
 4) 18735
 5) 11335
 6) 139 40 <-- This one changed so that it is a string
 7) 181 55
 8) 11759
 9) 176 74
10) 137 38

alors ça marche, ça lit tout, comme des chaînes.

Donc, le premier cas est un problème. Mais il y a une solution.

Disons que vous utilisez

  "Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"

où nous avons changé IMEX en 1 et HDR en YES, les données seront alors lues sous forme de chaînes dans les deux cas précédents. Mais disons que nous avons des données comme celle-ci

 1) zipcode
 2) 12545
 3) 11550
 4) 18735
 5) 11335
 6) 13940
 7) 18155
 8) 11759
 9) 17674
10) 137 38

toutes les 8 premières lignes de données sont alors numériques et échouent à nouveau, même si nous avons IMEX = 1.

Vous pouvez résoudre ce problème de la manière suivante. Changez la chaîne de connexion en ceci

  "Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'"

Notez que nous avons conservé IMEX = 1 mais que HDR a été remplacé par NO. 

Maintenant, la ligne 1 n'est plus traitée comme un en-tête et "code postal" est Lue comme une donnée et comme il s'agit clairement d'une chaîne, toutes les lignes sont lues comme des chaînes (c'est ainsi que fonctionne IMEX = 1). 

Cette méthode présente quelques inconvénients. Les deux peuvent être résolus:

1) Vous ne pouvez pas faire référence à la colonne par son nom (code postal), mais vous devez utiliser par exemple F7 en fonction de l'emplacement de la colonne. 

Vous pouvez résoudre ce problème en déterminant l'emplacement de la colonne du code postal (peut être fait par programme) et changez le texte SQL en conséquence de changer "code postal" en "F7" par exemple.

2) La valeur "code postal" apparaîtra dans vos données. 

Cela peut être résolu en ayant F7 <> 'code postal' dans votre clause where. Un pourrait penser que cela contrecarrerait le fait que nous avons inclus code postal (étant une chaîne) pour vous assurer que toutes les lignes sont traitées comme des chaînes . Après avoir testé cela, il s'avère que la clause where Le truc qui exclut le "code postal" n’a pas un tel effet antagoniste effet.

12
Magnus

Lorsque vous lisez un fichier Excel dans une table de données, celle-ci lit les valeurs des colonnes et, après environ 8 à 10 enregistrements, affecte le type de données à une colonne. Par exemple, si les valeurs de colonne sont 
11.0
22.0
33,0
44,0
55,0
66,0
77,0
88,0
99,0
abc
Ainsi, la table de données n'aura pas la valeur abc car le type de données "Double" a été attribué à la colonne. Pour éviter cela, et pour lire des données complètes, IMEX = 1 est utilisé.
S'il vous plaît, commenter pour d'autres questions.

0
Vishal Kotak