OleDbConnection を使用して Excel 2007 スプレッドシートをクエリしています。OleDbDataReader が列のデータ型として文字列のみを使用するように強制したい。
システムはデータの最初の 8 行を見て、データ型が Double であると推測します。問題は、行 9 にその列に文字列があり、Double にキャストできなかったため、OleDbDataReader が Null 値を返していることです。
これらの接続文字列を使用しました:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source="ExcelFile.xlsx";Persist Security Info=False;Extended Properties="Excel 12.0;IMEX=1;HDR=No"
Provider=Microsoft.Jet.OLEDB.4.0;Data Source="ExcelFile.xlsx";Persist Security Info=False;Extended Properties="Excel 8.0;HDR=いいえ;IMEX=1"
reader.GetSchemaTable().Rows[7].ItemArray[5] を見ると、dataType が Double になっています。
このスキーマの行 7 は、問題が発生している Excel の特定の列と相関しています。ItemArray[5] はその DataType 列です
リーダー用のカスタム TableSchema を作成して、ExcelFiles にアクセスするときに、システムがデータ型を推測するのではなく、すべてのセルをテキストとして扱うことはできますか?
このページで良い情報を見つけました: ADO.NET を使用して Excel スプレッドシートを読み取るためのヒント
ADO.NET インターフェイスの主な特徴は、データ型の処理方法です。(スプレッドシートを読んでいるときに、どのデータ型が返されるかという質問を慎重に避けてきたことに気付くでしょう。) 準備はできていますか? ADO.NET はデータの最初の 8 行をスキャンし、それに基づいて各列のデータ型を推測します。次に、その列のすべてのデータをそのデータ型に強制しようとし、強制が失敗するたびに NULL を返します!
ありがとう、
キース
これが私のコードの縮小版です:
using (OleDbConnection connection = new OleDbConnection(BuildConnectionString(dataMapper).ToString()))
{
connection.Open();
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = connection;
cmd.CommandText = SELECT * from [Sheet1$];
using (OleDbDataReader reader = cmd.ExecuteReader())
{
using (DataTable dataTable = new DataTable("TestTable"))
{
dataTable.Load(reader);
base.SourceDataSet.Tables.Add(dataTable);
}
}
}
}