web-dev-qa-db-ja.com

OLEDB接続文字列内のIMEXとは何ですか?

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

上記の接続文字列のIMEX=2の目的は何ですか?

32
Dimitar Tsonev

から ConnectionStrings

「列ヘッダーを結果セットに読み込み(ヘッダーがある場合でもHDR = NOを使用)、列データが数値の場合、IMEX = 1を使用してクラッシュを回避します。

常にIMEX = 1を使用することは、混合データ列のデータを取得するより安全な方法です。 ..」

データをExcelに書き戻す必要がある場合、IMEX値は非常に重要になる可能性があることに注意してください。 IMEXでインターネットを高速検索すると、さまざまなIMEX値の問題に関する多数の記事が見つかりました

30
Steve

OleDbConnectionでExcelファイルを読み取るときに潜在的な問題があります。

使用する場合

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

最初の8行に4(またはそれ以上)の数値がある次のような列の場合、型は数値と見なされ、文字列値はnullとして読み取られます。

ここでヘッダーがヘッダーとして使用されていないことに注意してください(HDR = NO)。したがって、「zipcode」行が最初の行です。 (これらの郵便番号は、形式がわからない場合に備えてスウェーデンのものです。)

 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

しかし、データが次のように見える場合、最初の8行の数値は3つだけです

 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

その後、動作し、すべてを文字列として読み取ります。

最初のケースは問題です。しかし、解決策があります。

あなたが使用するとしましょう

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

iMEXを1に、HDRをYESに変更すると、上記の両方のケースでデータを文字列として読み取ります。しかし、このようなデータがあるとしましょう

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

その後、最初の8つのデータ行はすべて数値であり、IMEX = 1であっても再び失敗します。

この問題は次の方法で解決できます。接続文字列をこれに変更します

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

IMEX = 1を維持したが、HDRをNOに戻したことに注意してください。

行1はヘッダーとして扱われなくなり、「zipcode」はデータとして読み取られます。これは明らかに文字列であるため、すべての行が文字列として読み取られます(IMEX = 1の動作)。

この方法にはいくつかの欠点があります。両方とも解決できます:

1)名前(zipcode)で列を参照することはできませんが、列の場所に応じて、たとえばF7を使用する必要があります。

これを解決するには、zipcode列の場所を見つけて(プログラムで実行可能)、「zipcode」を「F7」などに変更して、SQLテキストを適宜変更します。

2)データに値「zipcode」が表示されます。

これは、where句にF7 <> 'zipcode'を含めることで解決できます。これは、すべての行が文字列として扱われるように、zipcode(文字列)を含めたという事実を打ち消すと考えるかもしれません。これをテストした後、「zipcode」を除外するwhere句のトリックには、このような反作用効果がないことがわかりました。

12
Magnus

Excelファイルをデータテーブルに読み込むとき、データテーブルは列の値を読み取り、約8〜10レコード後にデータ型を列に割り当てます。たとえば、列の値が
11.0
22.0
33.0
44.0
55.0
66.0
77.0
88.0
99.0
abc
したがって、列にはデータ型「Double」が割り当てられているため、データテーブルには値abcがありません。これを回避し、完全なデータを読み取るには、IMEX = 1が使用されます。
追加クエリについてコメントしてください。

0
Vishal Kotak