- PR -

Microsoft Jet OLE DB Providerを使ってCSVファイルを読み込んだときのDataTypeについて

1
投稿者投稿内容
KH
会議室デビュー日: 2007/05/21
投稿数: 2
投稿日時: 2007-05-21 14:46
Microsoft Jet OLE DB Providerを使ってCSVファイルを読み込みます。
OleDbDataReaderのGetSchemaTableメソッドを使って列メタデータを取得し、それをDataGridViewに表示させます。
表示された結果を見ますと、DataTypeに割り当てられる型が意図しない型になっていることがあります。

下記テストプログラムを下記テストデータを使って実行させると
テストデータが全て「英字1文字+数字」の形式ですので文字型の扱いになり
全てがSystem.Stringになるものと考えておりました。
しかし、実行結果は、"F005"、"K005"、"S005"がSystem.StringではなくSystem.Decimalになります。

なぜ、その3つがSystem.Decimalになってしまうのか、原因を調査していますが、発見できず困っております。

原因をご存知の方がいらっしゃいましたら教えていただけないでしょうか。
よろしくお願いいたします。

[環境]
WindowsXP SP2
Visual C# 2005

[テストプログラム]
コード:
private void button4_Click(object sender, EventArgs e)
{
    string dir = "C:\\TEMP";
    string fname = "a2z.csv";
    string constr = string.Format(
        @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Text;HDR=Yes;FMT=Delimited""",
        dir);
    OleDbConnection con = new OleDbConnection(constr);
    con.Open();
    string sql = string.Format(
        "SELECT * FROM [{0}]", fname);
    OleDbCommand cmd = new OleDbCommand(sql, con);
    OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
    try
    {
        DataTable dt = reader.GetSchemaTable();
        dataGridView1.DataSource = dt;
    }
    catch (Exception)
    {}
    finally
    {
        con.Close();
        reader.Close();
        reader.Dispose();
    }
}



[テストデータ]
※1行目はヘッダとします。
---a2z.csvの内容--------------------------------------------------------------------------
A005,B005,C005,D005,E005,F005,G005,H005,I005,J005,K005,L005,M005,N005,O005,P005,Q005,R005,S005,T005,U005,V005,W005,X005,Y005,Z005
A005,B005,C005,D005,E005,F005,G005,H005,I005,J005,K005,L005,M005,N005,O005,P005,Q005,R005,S005,T005,U005,V005,W005,X005,Y005,Z005
------------------------------------------------------------------------------------------
るぷ犬
常連さん
会議室デビュー日: 2004/11/10
投稿数: 46
投稿日時: 2007-05-21 16:17
どうも、るぷ犬です。


直接の回答になっていませんが…。



データ部分を"(ダブルクォーテーション)で括ると、すべて文字型になりました。
どうやら、何行かのデータ部分で、判別しているようです。



なぜ、"F005"、"K005"、"S005"がSystem.Decimalになるのかはわかりません(すみません)。


あと、こんなQ&Aもありました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20039&forum=7&3
KH
会議室デビュー日: 2007/05/21
投稿数: 2
投稿日時: 2007-05-21 18:18
るぷ犬様
ご回答ありがとうございます。

私の方でも同じようにデータ部分を"(ダブルクォーテーション)で括って試したところ
文字型になることを確認しました。

引用:
あと、こんなQ&Aもありました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20039&forum=7&3


こちらの内容は私も確認しました。
Schema.iniを設定すれば意図した型で読み込ませることが可能なことも確認しました。
今回の場合、CSVファイルと同じフォルダに以下の内容のSchema.iniを設定しました。

---Schema.iniの内容--------------------------------------------------------------------------
[a2z.csv]
ColNameHeader=True
CharacterSet=OEM
Format=CSVDelimited
Col1=A005 Text
Col2=B005 Text
Col3=C005 Text
Col4=D005 Text
Col5=E005 Text
Col6=F005 Text
Col7=G005 Text
Col8=H005 Text
Col9=I005 Text
Col10=J005 Text
Col11=K005 Text
Col12=L005 Text
Col13=M005 Text
Col14=N005 Text
Col15=O005 Text
Col16=P005 Text
Col17=Q005 Text
Col18=R005 Text
Col19=S005 Text
Col20=T005 Text
Col21=U005 Text
Col22=V005 Text
Col23=W005 Text
Col24=X005 Text
Col25=Y005 Text
Col26=Z005 Text
------------------------------------------------------------------------------------------------

引用:
なぜ、"F005"、"K005"、"S005"がSystem.Decimalになるのかはわかりません(すみません)。


もし、他に何かわかりましたら、引き続き、ご回答いただけると助かります。
よろしくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)