Почему один запрос ADO.NET Excel работает, а другой нет?

Я работаю над рабочим процессом SharePoint, и на первом этапе мне нужно открыть книгу Excel и прочитать две вещи: диапазон категорий (из диапазона с именем, что достаточно удобно, Categories) и индекс категории (в именованном диапазоне CategoryIndex). ). Categories — это список примерно из 100 ячеек, а CategoryIndex — одна ячейка.

Я использую ADO.NET для запроса книги

string connectionString =
    "Provider=Microsoft.ACE.OLEDB.12.0;" +
    "Data Source=" + temporaryFileName + ";" +
    "Extended Properties=\"Excel 12.0 Xml;HDR=YES\"";

OleDbConnection connection = new OleDbConnection(connectionString);
connection.Open();

OleDbCommand categoryIndexCommand = new OleDbCommand();
categoryIndexCommand.Connection = connection;
categoryIndexCommand.CommandText = "Select * From CategoryIndex";

OleDbDataReader indexReader = categoryIndexCommand.ExecuteReader();
if (!indexReader.Read())
    throw new Exception("No category selected.");
object indexValue = indexReader[0];
int categoryIndex;
if (!int.TryParse(indexValue.ToString(), out categoryIndex))
    throw new Exception("Invalid category manager selected");

OleDbCommand selectCommand = new OleDbCommand();
selectCommand.Connection = connection;
selectCommand.CommandText = "SELECT * FROM Categories";
OleDbDataReader reader = selectCommand.ExecuteReader();

if (!reader.HasRows || categoryIndex >= reader.RecordsAffected)
    throw new Exception("Invalid category/category manager selected.");

connection.Close();

Не судите сам код слишком строго; это было через многое. Во всяком случае, первая команда никогда не выполняется правильно. Он не генерирует исключение. Он просто возвращает пустой набор данных. (HasRows это true, а Read() возвращает false, но данных там нет) Вторая команда работает отлично. Это оба именованных диапазона.

Однако населены они по-разному. Есть вызов веб-службы, который заполняет Categories. Эти значения отображаются в раскрывающемся списке. Выбранный индекс входит в CategoryIndex. После нескольких часов битья головой, я решил написать пару строк кода, чтобы значение выпадающего списка ушло в другую ячейку, затем я копирую значение с помощью пары строк C # в CategoryIndex, чтобы данные были установлены идентично . Это тоже оказалось тупиком.

Я что-то упускаю? Почему один запрос работает идеально, а другой не возвращает никаких данных?


person Alex    schedule 17.06.2009    source источник


Ответы (1)


Я нашел проблему. Очевидно, Excel не смог проанализировать значение в ячейке, поэтому ничего не возвращал. Что мне нужно было сделать, так это настроить строку подключения следующим образом:

string connectionString =
    "Provider=Microsoft.ACE.OLEDB.12.0;" +
    "Data Source=" + temporaryFileName + ";" +
    "Extended Properties=\"Excel 12.0 Xml;HDR=NO;IMEX=1\"";

Было бы полезно, если бы он генерировал исключение или давал какое-либо указание на причину сбоя, но сейчас это не имеет значения. Параметр IMEX=1 указывает Excel обрабатывать все значения только как строки. Я вполне способен анализировать свои собственные целые числа, большое спасибо, Excel, поэтому мне не нужна его помощь.

person Alex    schedule 17.06.2009