So-net無料ブログ作成

【VB.NET】ODBC ProviderでCSVを取り込むときにはschema.iniが必要な件 [Computer]

先日、VB.NETで、CSVからDataGridViewへデータを読みこむのにファイル開いて~、1行読んで~、ループして~とかやるのは面倒くさいと思い、もっと楽な方法がないか調べてると、ADOやODBCでやるとサクっといくことがわかった。ソースは以下の通りでシンプル。

-----------------------------------------------------------------------
'CSVファイルのあるフォルダ
Dim csvDir As String = "C:\"
'CSVファイルの名前
Dim csvFileName As String = "hoge.csv"

'接続文字列
Dim conString As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
+ csvDir + ";Extended Properties=""text;HDR=No;FMT=Delimited"""
Dim con As New System.Data.OleDb.OleDbConnection(conString)

Dim commText As String = "SELECT * FROM [" + csvFileName + "]"
Dim da As New System.Data.OleDb.OleDbDataAdapter(commText, con)

'DataTableに格納する
Dim dt As New DataTable
da.Fill(dt)
-----------------------------------------------------------------------

簡単にできたと思ったら、問題が1つ。
HH:MM というデータが、DataGridViewで表示させると、'1899/12/30 HH:MM:00'となってしまう。DataSouceの枠をStringで定義してないからダメなんだと思い、設定してみたが、状況は変わらず。
デバッグを進めていると、どうもODBCが勝手にデータの数件を見て、テーブルをレイアウトしてるっぽいということに行きついた。問題の列はDate型にされてしまっていると思われる。
それを防ぐには、CSVファイルと同じフォルダにschema.iniというiniファイルを置いて、中でテーブルのカラム定義をしてやる必要があるようだ。

---- schema.ini -------------------------------------------------
[hoge.csv]
ColNameHeader=True
Format=Delimited()
MaxScanRows=0
CharacterSet=OEM
Col1=columnname1 char width 50
Col2=columnname2 Date width 9
Col3=columnname3 integer
:
-----------------------------------------------------------------------

Section名は、csvのファイル名。ColNameHeaderは、1行目をデータとせずカラム名とするかどうか。Formatは区切り文字、ファイル形式。MaxScanRowsは先頭から何レコード目までに格納されているレコードを検査するか。0は全レコード検査する。





nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は180日以上新しい記事の更新がないブログに表示されております。