Я использую OleDbConnection для запроса таблицы Excel 2007. Я хочу заставить OleDbDataReader использовать только строку в качестве типа данных столбца.
Система просматривает первые 8 строк данных и выводит тип данных Double. Проблема в том, что в строке 9 у меня есть строка в этом столбце, а OleDbDataReader возвращает значение Null, так как оно не может быть перенесено в Double.
Я использовал эти строки подключения:
Provider = Microsoft.ACE.OLEDB.12.0; Источник данных = "ExcelFile.xlsx"; Persist Security Info = False; Расширенные свойства = "Excel 12.0; IMEX = 1; HDR = Нет"
Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = "ExcelFile.xlsx"; Persist Security Info = False; Расширенные свойства = "Excel 8.0; HDR = Нет; IMEX = 1"
Глядя на reader.GetSchemaTable(). Строки [7].ItemArray [5], это dataType - Double.
Строка 7 в этой схеме коррелирует с конкретным столбцом в Excel. У меня возникают проблемы. ItemArray [5] - это столбец DataType
Возможно ли создать пользовательский TableSchema для чтения, поэтому при доступе к ExcelFiles я могу рассматривать все ячейки как текст, а не позволять системе пытаться вывести тип данных?
Я нашел полезную информацию на этой странице: Советы по чтению таблиц Excel с использованием ADO.NET
Основная особенность интерфейса 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);
}
}
}
}