none
ADO.NETを使用してEXCELファイルをACCESSにインポート時、自動で型変換されてしまう。 RRS feed

  • 質問

  • お世話になっております。さっとんです。

    システム前提

    VS.NET2008 EXPRESS EDITION

    .NET FRAMEWORK3.5(SP1)

    OFFICE2003

    Vb.netにてExcelデータを読み込んでAccessにインポートする機能を
    ADO.netで実現しようとしているのですが、
    Excelデータに同じ列に型が違うデータが設定されていると、
    型がエラーになってしまい、元のデータが読み込まれません。

    ○Excelデータ
    項番 名前 
    1    テスト太郎
    2    テスト次郎
    3    テスト三郎
    A    2
    ※上記の場合は4件目のデータが読み込まれない
    ※Excelオブジェクトを使用もしてみましたが、
    読み込み速度がADO.netと比べると全然、違うので使用していません。

    他にADO.netを使用して型が違うデータが混在してるExcelデータを正常に
    読み込める方法は何かないでしょうか?

    2011年9月1日 13:40

回答

  • OLEDB プロバイダを使用されているのですよね。
    「IMEX=1」の話が関係していると思います。

    下記1つ目のリンク先に書かれているように「IMEX=1」を指定すれば、今回のデータの場合は8行目までに型が混在しているので正しく読み取れるようになると思います。
    ただ、もし "A" と "2" のようなデータが9行目だった場合にはこの指定を行ってもダメなので、結局は2つ目のリンクに書かれているように、レジストリを修正して検査される行数を増やす必要が生じてしまいます。
    レジストリを変更しなくてもいい方法があればよいのですが。。。

    [HOWTO] Visual Basic または VBA から ADO を Excel データで使用する
    http://support.microsoft.com/kb/257819/ja/

    [PRB] DAO の OpenRecordset を使用すると Excel の値として NULL が返される
    http://support.microsoft.com/kb/194124

    佐祐理さん
    > これはExcelオブジェクトの扱い方の問題です。正しい使い方をすれば「全然、違う」ほど遅くはないはずです。

    そうでしょうか?
    ADO での処理に比べれば結構遅いので、データ量によっては断然違っちゃうと思います。

    2011年9月2日 1:53

すべての返信

  • 本題ではないですが、
    ※Excelオブジェクトを使用もしてみましたが、読み込み速度がADO.netと比べると全然、違うので使用していません。
    これはExcelオブジェクトの扱い方の問題です。正しい使い方をすれば「全然、違う」ほど遅くはないはずです。
    2011年9月1日 17:22
  • OLEDB プロバイダを使用されているのですよね。
    「IMEX=1」の話が関係していると思います。

    下記1つ目のリンク先に書かれているように「IMEX=1」を指定すれば、今回のデータの場合は8行目までに型が混在しているので正しく読み取れるようになると思います。
    ただ、もし "A" と "2" のようなデータが9行目だった場合にはこの指定を行ってもダメなので、結局は2つ目のリンクに書かれているように、レジストリを修正して検査される行数を増やす必要が生じてしまいます。
    レジストリを変更しなくてもいい方法があればよいのですが。。。

    [HOWTO] Visual Basic または VBA から ADO を Excel データで使用する
    http://support.microsoft.com/kb/257819/ja/

    [PRB] DAO の OpenRecordset を使用すると Excel の値として NULL が返される
    http://support.microsoft.com/kb/194124

    佐祐理さん
    > これはExcelオブジェクトの扱い方の問題です。正しい使い方をすれば「全然、違う」ほど遅くはないはずです。

    そうでしょうか?
    ADO での処理に比べれば結構遅いので、データ量によっては断然違っちゃうと思います。

    2011年9月2日 1:53
  • こんにちは、さっとん さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    しばらく時間が経ちましたが、その後いかがでしょうか。

    有効な情報をいただいているかと思われましたので、他の方にも情報を有効活用いただくため、勝手ながら回答としてマークさせていただきました。
    TH01 さん、情報ありがとうございます。
    ちょっと検索してみました。複数のデータ型が混在するという場合には、下記資料がもしかしたら参考になるかもしれません。

      Access にて 複数のデータ型が混在する Excel のデータ (XLS 形式 または XLSX形式) をインポートするときに、エラー メッセージ "データ型変換エラー" が表示される場合がある
      http://support.microsoft.com/kb/968580

      (PRB: Jet 4.0LEDB のソースからのデータの転送バッファー オーバーフロー エラーで失敗します。)
      (http://support.microsoft.com/kb/281517)

      Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法
      http://support.microsoft.com/kb/316934

    もし、まだ問題が解決されていない場合には、確認された結果などを記載して、ご質問を続けてくださいね。
    よろしくお願いいたします。
                                                                             
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年9月28日 6:29
    モデレータ
  • 一応、プログラム側ではなくてデータ側での解決方法も書いておきます。(KB を読めば書いてありますが)

    1. Excel でファイルを開く
    2. 項番列を選択する
    3. セル形式を「文字列」にする
    4. 全セルを入力しなおす

    とすれば、項番を文字列として読み込むようになりますので、1, 2, 3, A すべてが読み込めるようになります。(たぶん、最初の8行だけ対応してればOK)

    電話番号や日付関連の誤認識も、この方法で対応できます。データとして読み込む Excel では、「標準」形式のセルはデータとしてみると曖昧になるので使わないのが一番かと…。

     

    2011年9月29日 3:59
  • > ADO での処理に比べれば結構遅いので、データ量によっては断然違っちゃうと思います。

    ISAM は対象ファイルを開いて勝手に中身を処理するだけなのですが、オートメーションは Excel が本当に起動するので、その時点で PC のスペック次第では大差がついちゃいかねないですね。

    Excel が起動していて安定状態にあるところから、ファイルを開いて内容を読み取るだけであれば、きめ細かい制御ができる利点をもちつつ結構いい勝負ができるかもしれませんね。

    2011年9月29日 4:03