Delphi sql запрос к excel

Обновлено: 04.07.2024

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Доступ к базе данных в компонентах ADO осуществляется или с помощью строки соединения - свойства ConnectionString, или с помощью отдельного компонента ADOConnection, имя которого задается в свойстве Connection других компонентов. В этом случае значение свойства ConnectionString задается в компоненте ADOConnection.

Различные варианты формирования строки соединения подробно рассмотрены в [1] и [5]. Там же рассмотрены общие вопросы использования компонентов ADO. Поэтому, чтобы не повторяться, ниже рассмотрены только некоторые вопросы связи с базами данных Excel.

Один из вариантов получения доступа к базе данных (другие варианты см. в [1] и [5]) - создание источника данных ODBC с помощью редактора свойства ConnectionString. Перенесите на форму компонент ADOQuery и щелкните в Инспекторе Объектов на кнопке с многоточием рядом со свойством ConnectionString. Перед вами откроется окно, показанное на рис. 6.4. В нем надо включить радиокнопку Use Connection String и щелкнуть на кнопке Build.

Первое окно формирования строки соединения

6.6 Работа с книгой Excel как с базой данных ADO

Перед вами откроется многостраничное окно, относящееся уже не к Delphi, а к Microsoft ODBC. На странице Поставщик данных этого окна надо выделить про-ставщика данных Microsoft OLE DB Provider for ODBC Drivers. Затем можно щелкнуть кнопку Далее, чтобы перейти на страницу Подключение (рис. 6.5) или просто самому перейти на эту страницу. Если у вас источник данных уже создан, то его просто надо выбрать из списка под радиокнопкой Использовать имя источника данных. Но мы предполагаем, что нам еще только предстоит создать нужный источник данных. Для его создания надо включить радиокнопку Использовать строку подключения, и затем щелкнуть на кнопке Сборка.

Окно выбора подключения

6.6 Работа с книгой Excel как с базой данных ADO

Ну вот не долго думая, подошла вторая часть по работе с ADO в DELPHI на примере БД — MS Excel. В данной статье мы рассмотрим добавление и редактирование данных, так как с удалением тут возникли проблемы, в связи с тем, что данный драйвер не поддерживает удаление, ну с удалением мы что-нибудь подумаем. Сразу хочу сказать, что необходимо еще одно поле в нашей Excel-книги — id, и нам придется вручную его заполнять, что не есть хорошо, но ничего тут сложного нету, просто при инициализации данных, мы просто получаем количество записей в нашей БД, а затем при добавлении добавляем это значение в поле id. Вот и у нас будет получаться уникальное значение, что поможет нам при редактировании. Тут как всегда, думаю что писать на OnCreate нашей главной формы понятно, обычный запрос, только затем еще необходимо получить количество записей в нашей БД, что мы делаем с помощью RecordCount. Смотрим код события OnCreate формы ниже

Для добавления данных все тоже самое, что и было в ADO с MS Access, только здесб повторюсь надо учитывать id вручную нам, в а MS Access все было подругому, там был счетчик, что облегчало нам работу. Код добавления смотрим ниже

Ну я тут еще сделал дополнительный запрос, для обновления данных в TDBGrid.Для редактирования данных нам надо получить сначала id, для этого на событие компонента TDBGrid - OnCellClick напишем

У меня id поле находится в книге Excel в 3 столбце, но так как нумерация в ADO столбцов начинается с 0, то я указал Fields[2]. Для редактирования данных применим туже технологию, что и в случае с MS Access

И также как видем, дополнительный запрос на обновления данных, id у нас уже получен, так что все обновиться. Да и не забыли ведь, что в комоненте TADOQuery задайте в свойстве Parameters новый параметр — pid с типом данных ftInteger. Ну и наконец-то попробуем какой-нибудь не большой поиск организовать, здесь я использовал параметр SQL-запроса — LIKE, то есть найдет все записи с совпадениями, что мы указываем. Смотрим код ниже

Можно организовать поиск по полному совпадению просто через WHERE, но пока что так. Теперь понимаете, что использовать MS Excel в качестве БД тут не логично, много чего вручную контролировать нужно, ограниченное количество записей, да и с удалением проблемы, но зато отлично тут можно написать конвертацией данных, а также экспорт в Excel например или в MS Access из MS Excel. Но мы пока что займемся экспортом в Excel, а затем напишем свой конвертатор. Но это в следующий частях про MS Excel как БД в Delphi.

В первой части мы рассмотрели как правильно подключить БД MS Access в проект Delphi. Сейчас мы рассмотрим примитивную работа с данными компонентами, а также некоторые свойства их. Кроме это попробуем сделать небольшие запросы к БД и добавлять, редактировать информацию, удалять и перемещаться в таблице по записям. Мы все прекрасно помним компонент TDBGrid. Так вот в нем для удобства я нажал двойным щелчком левой кнопкой мыши и в появившемся окне я создал 2 поля, нажав на кнопку Add new. Затем выбрав первой поле в свойстве FildName я прописал вручную fio, в том же свойстве для второго поля я прописал oz. Затем я перешел в свойство Title раскрыл его и в подсвойстве Caption для 1-го поля я указал ФИО, а для 2-го поля я указал Оценка. Затем в свойстве компонента TDBGrid я раскрыл свойство Options и в подствойстве dgEditing я установил False, а в подсвойстве dgRowSelect я установил True. dgEditing - я запретил редактирование в самой таблице, а dgRowSelect этим свойством выделяется вся строка в таблице. На главную форму нашего приложения я «установил» следующие компоненты и вот что у меня получилось


Далее на кнопку «Добавить» я написал следующий код

Здесь самой главное — это Insert. То есть это означает, что мы вставляем новую строку в нашу таблицу. FieldByName - указываем в какое поле мы вставляем информацию и AsType - необходимо указать тип наших данных, которые мы вставляем.

На кнопку «Удалить» я написал следующий код

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

На кнопку «Редактировать» я написал следующий код

Здесь самое главное это метод Edit, который ставит текущую строку в режим редактирование, а дальше точно также как и с добавлением, редактирование и добавление также можно написать с помощью запросов, что мы и рассмотрим в следующей статье.

Перед тем как редактировать я на событие DBGrid - OnCellClick написал получение данные в наши поля, чтобы мы могли их отредактировать потом, то есть чтобы пользователь видел какие данные там раньше находились, до редактирования

Здесь почти точно также как и в добавлении, только мы делаем все наооборот, присваиваем значения из таблицы в наши поля.

На кнопку «Вниз» я написал следующий код

Метод Last означает, что мы переместимся на последнюю запись нашей таблицы

На кнопку «Обновить» я написал следующий код

Метод Refresh означает, что мы обновляем данные в таблице и соответственно они обновляются и перед нами

На кнопку «Вверх» я написал следующий код

Метод First означает, что мы перейдем на первую запись в нашей таблице

На кнопку «Далее» я написал следующий код

Метод Next означает, что мы будем проходить последовательно по записям вниз

Метод Prior означает, что мы будем проходиться последовательно по записям нашей таблицы вверх

Далее после редактирования, добавления данных нам необходимо их сохранить, вот поэтому и существует у нас кнопку «Сохранить» на событие OnClick, которой я написал следующий код

Здесь все просто метод Post сохраняет все измененные данные в нашей таблице.

Далее идут у нас кнопку с небольшими запросами, на кнопке «Вывести всех с оценками 10» по событию OnClick я написал следующий код

Здесь у нас идет обычный запрос с условием, условие у нас задается с помощью конструкции Where. Здесь мы и указываем какие записи выводить. Метод Clear - очищает все что было в SQL, а ADD - добавляет текст SQL.

Далее на кнопке «Вывести все фамилии, в которых присуствует Иван» я написал следующий код

Здесь у нас уже новенькое в SQL-синтаксисе LIKE и конструкции %%, да именно эта конструкция и ищет совпадения Иван в поле fio во всех записях. И наконец выводим все записи нашей таблиц для этого достаточно написать следующий код

Также во вкладке ADO есть хороший компонент TADOTable, который работает по такому же принципу как и TADOQuery, но в TADOTable нельзя формировать SQL-запросы, поэтому я предпочитаю TADOQuery. В следующей статьи про БД я напишу как добавлять, редактировать и удалять данные с помощью SQL-запросов. Исходник данной статьи Вы сможете скачать на странице Исходники

Как и обещал и не долго думая написал пару запросов к БД MS Access, через которые можно добавлять данные в нашу БД, редактировать, удалять. Да конечно через запросы делать может немного сложнее для кого-то, но не для нас правда? Просто через запросы это все дело происходит быстрее. Например, чтобы удалить все данные нам из таблицы без запросов, то нам необходимо пройти все это дело циклом, а это время, а если записей в БД 200000, а через запрос, если это все дело организовать, то будет на много приятнее, красивее и конечно же быстрее, что немаловажно для нас. Здесь отличия у нас будут следующие:

  • вместо Active мы будем использовать ExecSQL
  • ну и конечно же будем использовать запросы

Кто забыл как мы добавляли, редактировали, удаляли и так далее записи в БД MS Access в Delphi через технологию ADO, сможет посмотреть вот в этой статье.

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

Здесь ничего нового для Вас нету, мы это уже делали в прошлой статье по Базам данных, так что комментировать тут ничего не буду, мы просто делаем запрос на все записи в таблице нашей — Student.

Далее мы добавим данные с помощью запроса, для этого на событие кнопки OnClick напишем следующий код

Здесь у нас новый вид запроса INSERT INTO. Здесь мы указываем таблицу, в которую будем добавлять данные, а затем в скобках перечисляются поля, в которые будем вставлять данные, а затем VALUES и в скобках такое же количество данных, сколько указали и полей. Как видите ничего не сложно. И потом ExecSQL мы просто выполняем наш запрос, так как такие запросы надо выполнять, Active здесь не «прокатит«. Запрос делаем мы затем на вывод всех данных, в связи с тем, что после добавление, редактирования, удаления наш DBGrid не хочет обновляться, видно «глючность» ADO поэтому я решил на время решить эту проблему именно так.

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

Далее на событие DBGrid OnCellClick я написал следующее

id - типа integer, не забудьте объявить.

Здесь мы получаем это самое уникальное поле, а уникальное оно будет всегда потому, что у id в таблице тип Счетчик и он соответственно никогда не будет повторяться.

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

Здесь мы запросом DELETE удаляем запись по условию id=:pid. А pid мы присваиваем значение, которое получаем по клику на наш DBGrid. Здесь немного поясню в TAdoQuery есть свойство Parametrs, там нам необходимо добавить параметр новый, указать его имя и тип, в данном случае я выбрал тип — ftInteger. Затем после запроса мы этот параметр заполняем, а в самом запросе используем, то есть чтобы удалили именно текущую запись, удаляем по условию где задаем с помощью WHERE.

Удалить все данные еще проще

Здесь мы не указываем никаких параметров ничего просто удаляем все записи, вот про что я говорил, что запросом удалить все записи намного быстрее чем через цикл.

И наконец отредактируем данные вот так

Здесь используется конструкция UPDATE SET, указываем таблицу где обновлять данные через SET указываем поля, которые обновляем и сразу через «=» задаем им новые значения, ничего сложного, ну и конечно нам надо отредактировать именно выделенную запись (текущую), поэтому также задаем условие WHERE id мы один раз на OnCellClick получаем, поэтому он у нас в любом случае будет чему-то равняться. Ну что как видите ничего сложного. Дальше мы рассмотрим как работать в ADO с BLOB-полями, их преимущества и многое другое.

Читайте также: