0

C#を介してSQLバルクコピー方式を使用して、シートから2lacを超えるレコードを含むいくつかのダーティエクセルファイルをインポートしています。

問題:

  1. OleDbDataReaderC#を使用してExcelファイルを読み取る場合に、タイプ推測の問題があるを介してデータを読み取っています。列のデータ型を推測し、行が日時値で始まる場合、含まれている列が日時値であることを自動的に識別し、その行の他のすべての文字列値がリーダーによってnullとして挿入/読み取られます。

  2. 255文字の切り捨てを伴う文字列値にも問題があります。一部の値が255文字未満の場合、含まれている列はメモではなくテキストであると推測されます。

これらの2つの問題のために、C#を使用してExcelからSQL Serverにデータをインポートすることは完璧ではないと思います-何かアイデアはありますか?

4

2 に答える 2

1

他のものを使用して、Excel のものをインポートします。

http://epplus.codeplex.com/

于 2012-03-28T14:46:49.620 に答える
0

外部コンポーネントを使用せずにこれを行うための 2 つのアプローチを知っています。

1ファイルをインポートする前に CSV として保存できる場合は、テキスト ファイル ドライバーとschema.iniファイル アプローチを使用できます。これにより、データ型を列ごとに明示的に宣言できます

schema.ini アプローチは SQL OPENROWSET コマンドでも機能し、途中で C# を使用することなく CSV から SQL に直接インポートでき、列のデータ型を指定することもできます。

2レジストリのハッキングにアレルギーがない場合は、Microsoft の提案があります。

レジストリ キーを変更することをお勧めします。

HKLM\Software\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows

または 64 ビット システムの場合:

HKLM\SOFTWARE\wow6432node\microsoft\jet\4.0\engines\excel\TypeGuessRows

この値を 0 に設定すると、デフォルトの 8 行ではなく、スプレッドシートの最初の 16384 行が型推測のためにスキャンされます。255 文字を超えるテキスト フィールドが検出された場合、それらの列はメモ フィールドと見なされます。

データによっては、適切なデータ型を取得することが100% 保証されているわけではないことに注意してください。

ただし、このキーの HKLM スコープにも注意してください。これは、そのマシン上のプロセスによるすべての OleDB Excel インポートに影響します。

または、レジストリをハッキングせずに:

この問題を (レジストリを変更せずに) 回避する 2 つ目の方法は、255 文字以上のデータを持つフィールドを持つ行が、ソース データ ファイルの最初の 8 行に存在することを確認することです。

これはおそらく不可能です。

于 2012-03-28T15:16:06.883 に答える