Как вынудить ADO.NET использовать только Систему. Тип данных String в читателях TableSchema

Я использую OleDbConnection для запросов электронной таблицы Excel 2007. Я хочу, вынуждают OleDbDataReader использовать только строку в качестве типа данных столбца.

Система смотрит на первые 8 строк данных и выводит тип данных, чтобы быть Двойной. Проблема состоит в том, что на строке 9 у меня есть строка в том столбце, и OleDbDataReader возвращает Нулевое значение, так как это не могло быть брошено к Двойному.

Я использовал эти строки подключения:

Provider=Microsoft. ТУЗ OLEDB.12.0; источник данных = "ExcelFile.xlsx"; сохраните безопасность Info=False; расширенные свойства = "Excel 12.0; IMEX=1; HDR=No"

Provider=Microsoft. Струя. OLEDB.4.0; источник данных = "ExcelFile.xlsx"; сохраните безопасность Info=False; расширенные свойства = "Excel 8.0; HDR=No; IMEX=1"

Рассмотрение читателя. GetSchemaTable ().Rows[7].ItemArray[5], это - тип данных, является Двойным.

Строка 7 в этой схеме коррелирует с определенным столбцом в Excel, с которым у меня есть проблемы. ItemArray[5] является своим столбцом DataType

Действительно ли возможно создать пользовательский TableSchema для читателя поэтому при доступе к ExcelFiles, я могу рассматривать все ячейки как текст вместо того, чтобы позволить системе попытаться вывести тип данных?


Я нашел некоторую хорошую информацию на уровне этой страницы: Подсказки для чтения электронных таблиц Excel с помощью ADO.NET

Основная причуда об интерфейсе ADO.NET - то, как обрабатываются типы данных. (Вы заметите, что я тщательно избегал вопроса, из которого типы данных возвращаются при чтении электронной таблицы.) Вы готовы к этому? ADO.NET сканирует первые 8 строк данных, и на основе этого предполагает тип данных для каждого столбца. Затем это пытается принудить все данные от того столбца до того типа данных, возвращая ПУСТОЙ УКАЗАТЕЛЬ каждый раз, когда приведение перестало работать!

Спасибо,
Keith


Вот уменьшенная версия моего кода:

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);
            }
        }
    }
}

12
задан Keith Sirmons 5 April 2010 в 14:41
поделиться

2 ответа

Как вы обнаружили, OLEDB использует Jet, который ограничен в способе настройки. Если вы настроили использование OleDbConnection для чтения из файла Excel, вам необходимо установить значение HKLM \ ... \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ TypeGuessRows равным нулю, чтобы система просканирует весь набор результатов.

Тем не менее, если вы готовы использовать альтернативный механизм для чтения из файла Excel, вы можете попробовать ExcelDataReader . Он читает все столбцы как строки, но позволяет использовать методы dataReader.Getxxx для получения типизированных значений. Вот пример, заполняющий DataSet :

DataSet result;
const string path = @"....\Test.xlsx";
using ( var fileStream = new FileStream( path, FileMode.Open, FileAccess.Read ) )
{
    using ( var excelReader = ExcelReaderFactory.CreateOpenXmlReader( fileStream ) )
    {
        excelReader.IsFirstRowAsColumnNames = true;
        result = excelReader.AsDataSet();
    }
}
7
ответ дан 2 December 2019 в 22:22
поделиться

Окончательный ответ можно найти на этой странице .


Только что заметил, что страница, на которую вы ссылаетесь, говорит то же самое ...


Обновление :

Проблема, похоже, связана с самим движком JET, а не с ADO. Как только JET выбирает тип, он придерживается его. Все, что сделано после этого, не имеет никакого эффекта; например, преобразование значений в строку в SQL (например, Cstr ([Column])) просто приводит к возвращению пустой строки.

На этом этапе (если нет других ответов) я бы выбрал другие методы: изменение таблицы; изменение реестра (не идеально, так как вы будете возиться с настройками для всех других приложений, использующих JET); Автоматизация Excel или сторонний компонент, не использующий JET.

Если автоматизация слишком медленная, то, возможно, просто используйте ее для сохранения электронной таблицы в другом формате, с которым будет проще работать.

1
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: