質問: 0 To schemaTable.Rows.Count - 1 If schemaTable.Rows(i)("TABLE_NAME").ToString.Contains("Print_Area") Then Continue For End If Dim ExcelCommand As New OleDbCommand("SELECT * FROM [" & schemaTable.Rows(i)("TABLE_NAME").ToString & "] ", conn) Dim ExcelAdapter As New OleDbDataAdapter(ExcelCommand) ExcelAdapter.Fill(ds, schemaTable.Rows(i)("TABLE_NAME").ToString) ExcelCommand.Dispose() ExcelAdapter.Dispose() Next i
回答: 単純にFillせずに、スキーマ情報(テーブル構造)を取得・変更してからFillしてみたらどうでしょうか? 具体的には ExcelAdapter.Fill の1行の代わりに以下のようなコードにします。 ``` 'まずはスキーマ情報を取得する Dim dt As DataTable = New DataTable ExcelAdapter.FillSchema(dt, SchemaType.Source) 'Date型の列をDouble型にする For Each column As System.Data.DataColumn In dt.Columns If column.DataType Is GetType(Date) Then column.DataType = GetType(Double) End If Next 'スキーマ情報を使ってデータを取得する ExcelAdapter.Fill(dt) dt.TableName = schemaTable.Rows(i)("TABLE_NAME").ToString ds.Tables.Add(dt) ``` とりあえず Date型と判定された列を全て Double型にしています。 本当にDate型だった列までDouble型にしてしまうんですけどね・・・ Double型とDate型をなるべく正確に判定したい場合は EXCEL自身を操作するか、NPOIなどを使うことになるかも。 EXCELの内部には日付型が無くて数値型として管理しているので難しいですよね。