2009-06-17 2 views
4

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

Я использую 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, так что данные устанавливаются одинаково , Оказалось, что это тоже тупик.

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

ответ

2

Я нашел проблему. 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, поэтому мне не нужна была его помощь.

 Смежные вопросы

  • Нет связанных вопросов^_^