Обновление листа Excel с помощью OleDb

Я пытаюсь обновить одну ячейку листа Excel. Обратите внимание: в моем примере кода ниже я использую переменные для столбца и строки, потому что они будут меняться в соответствии с другими частями моей программы, но для целей отладки я установил для них значения A и 1 соответственно.

Прямо сейчас я получаю сообщение об ошибке «Синтаксическая ошибка (отсутствует оператор) в выражении запроса '06: 31 PM '.

Пожалуйста, не предлагайте просто параметризовать, потому что я знаю, что это не решит мою проблему, и меня не беспокоит инъекция.

Заранее всем спасибо.

        string newColumn = "A";
        string newRow = "1";
        string worksheet2 = strMonth;

        var cnnStr2 = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"", textBox1.Text);
        var cnn2 = new OleDbConnection(cnnStr2);

        cnn2.Open();

        string sql2 = String.Format("UPDATE [{0}$] SET {1}{2}={3}", worksheet2, newColumn, newRow, dtpTime.Text.Substring(0, 8));
        OleDbCommand objCmdSelect = new OleDbCommand(sql2, cnn2);
        objCmdSelect.ExecuteNonQuery();

        cnn2.Close();

РЕДАКТИРОВАТЬ: на основе ссылки, предложенной Герхардом, я изменил текст моей команды на следующий:

string sql2 = String.Format("UPDATE [{0}${1}{2}:{1}{2}] SET F1='{3}'", worksheet2, newColumn, newRow, dtpTime.Text.Substring(0, 8));

Теперь это вызывает ошибку «Операция должна использовать обновляемый запрос». Не уверен, что теперь делать. {1} {2}: {1} {2} дает диапазон отдельных ячеек на листе {0} $, а F1 - имя столбца по умолчанию, заданное, если нет имен столбцов, которые я указал в строке подключения с помощью HDR = НЕТ. Наконец, {3} - это подстрока, которой я обновляю ячейку, и она заключена в одинарные кавычки просто потому, что, кажется, все так делают. Если я удалю одинарные кавычки, это приведет к другой ошибке.


person Mikkel Bang    schedule 22.08.2013    source источник
comment
Ага. Затем ошибка изменится на Не указано значение для одного или нескольких обязательных параметров.   -  person Mikkel Bang    schedule 23.08.2013
comment
Спасибо, Герхард! Эта ссылка была очень полезной.   -  person Mikkel Bang    schedule 23.08.2013
comment
Вы рассматривали возможность использования взаимодействия Excel COM?   -  person Tarik    schedule 23.08.2013
comment
Если вы решили проблему, опубликуйте ее и отметьте как решенную. Таким образом вы помогаете другим людям и повышаете свою репутацию.   -  person Gerhard Powell    schedule 27.08.2013
comment
Я даже не видел этого комментария, пока не опубликовал свое решение, ха-ха. Но хорошая идея Герхарда, великие умы бла-бла-бла.   -  person Mikkel Bang    schedule 27.08.2013


Ответы (2)


Моя отредактированная командная строка верна. Однако, чтобы избавиться от новой ошибки, мне пришлось убрать «IMEX = 1» в строке подключения. Не уверен на 100%, почему это работает, но это действительно так.

Одна вещь, которую я заметил при поиске информации об использовании команд oledb, заключается в том, что многие, как и я, похоже, не понимают, что на самом деле делает каждая часть команды. Я до сих пор не совсем понимаю некоторые особенности, которые вы можете добавить к нему, например «ГДЕ», но я хотел бы добавить здесь немного, чтобы помочь всем, кто найдет этот вопрос и столкнется с аналогичными проблемами.

В операторе SELECT, если вы хотите выбрать одну ячейку, вы можете использовать что-то вроде этого:

string commandString = String.Format("SELECT * FROM [{0}${1}{2}:{1}{2}]", worksheetName, column, row);

«SELECT * FROM» выберет все из «workheetName». Затем вы должны поставить после имени своего рабочего листа символ «$». Затем «{1} {2}: {1} {2}» - это диапазон ячеек, который вы выбираете. Здесь, сделав столбец и строку по обе стороны от двоеточия одинаковыми, вы выбираете диапазон одной ячейки. Например, «E3: E3» выберет только то, что находится в ячейке E3.

В операторе UPDATE, если вы хотите обновить одну ячейку, вы можете использовать что-то вроде:

string commandString = String.Format("UPDATE [{0}${1}{2}:{1}{2}] SET F1='{3}'",worksheetName, column, row, data);

Единственное отличие, которое следует отметить, - это «SET F1 = '{3}'». Это установит ячейку, которую вы указали в своем диапазоне, на то, что находится в переменной данных. Обратите внимание на использование «F1». Это просто значение по умолчанию, которое используется, когда в строке подключения указано «HDR = NO», другими словами, нет заголовков или имен столбцов. Если бы у вас были заголовки столбцов, вы бы использовали их вместо F1. Здесь важно понимать, что F1 никак НЕ соответствует ячейке F1.

person Mikkel Bang    schedule 27.08.2013

Я провел выходные с этой проблемой. Наконец, я смог решить. Я изменил строку подключения на:

Microsoft.Jet.OLEDB.4.0; Источник данных = 'путь к файлу'; Расширенные свойства = 'Excel 8.0'

С опциями OUT IMEX или HDR. Раньше я проверял и менял проверку защиты клеток в файле Excel. Надеюсь, это поможет другим.

person Hayuco Dev    schedule 02.01.2018