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

Итак, что нам потребуется, в данный момент нам потребуется БД, таблица в нашей БД ну и компоненты, а также некоторый набор данных в нашей. Итак давайте на форму установим следующие компоненты

  • TMyConnection
  • TMyQuery

«Свяжем» компонент TMyQuery в свойстве Connection - выберем компонент MyConnection1 (в моем случае). Далее сделаем подключение к нашей БД через поток. Данные для подключения у меня следующие

  • Сервер – localhost
  • Имя пользователя – test
  • Пароль – test
  • Имя БД – test

При этом, если Вы сейчас тестируете на Denwer’e, то не забывайте запустить сервер. У меня был объявлен следующий поток

Type
  TMyThreadConnect=class(TThread)
   public
    flagConnect:boolean;
   protected
    procedure Execute;override;
    procedure Connect;
end;

После этого заполним нашу процедуру Execute и Connect

procedure TMyThreadConnect.Execute;
begin
  inherited;
    Form1.MyConnection1.Server:='localhost';
    Form1.MyConnection1.Username:='test';
    Form1.MyConnection1.Password:='test';
    Form1.MyConnection1.Database:='test';
    Form1.MyConnection1.Connect;
    if Form1.MyConnection1.Connected=True then
     flagConnect:=True
    else
     flagConnect:=False;
    Synchronize(Connect);
end;
procedure TMyThreadConnect.Connect;
begin
   if flagConnect=True then
    ShowMessage('Connect to Server');
end;

Теперь создадим наш поток

procedure TForm1.Button1Click(Sender: TObject);
var
 ThreadConnect:TMyThreadConnect;
begin
   try
    ThreadConnect:=TMyThreadConnect.Create(False);
    ThreadConnect.Resume;
   except
    on e:Exception do
   end;
end;

Итак теперь, как я и говорил сделаем несколько запросов к нашей БД. Скажу одно, что принцип работы с данной БД одинаков, как мы и работали с Access с помощью запросов. Можно также установить на форму TDBGrid для отображения данных из нашей БД. Таблица я создал с названием test_table и со следующими полями

  • id — auto_increment
  • fio — TEXT

Запрос на добавления данных будет выглядеть следующим образом

procedure TForm1.Button3Click(Sender: TObject);
begin
   MyQuery1.SQL.Clear;
   MyQuery1.SQL.Add('INSERT test_table SET fio=''Иванов Иван Иванович''');
   MyQuery1.Execute;
end;

Запрос на выборку данных по условию будет выглядеть следующим образом

procedure TForm1.Button4Click(Sender: TObject);
begin
   MyQuery1.SQL.Clear;
   MyQuery1.SQL.Add('SELECT * FROM test_table WHERE fio=''Иванов Иван Иванович''');
   MyQuery1.Execute;
   ShowMessage(IntToStr(MyQuery1.RecordCount));
end;

Как видите запросы везде одинаковые, по работе с MySQL с использованием Denwer я уделю еще — работа с Blob-полями и на этом закончим, так как все почти одинаковое.

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

Исходник можно скачать тут

Автор статьи - Andrey53

Метки: , , , ,




К записи “Работа с MySQL с использованием Denwer. Часть 2” оставлено комментариев: 7.

  1. парсинг статей « Эхо блогосферы:

    […] Andrey53 пишет: Delphi, idhttp, работа с сетью в delphi, adoquery< adoconnection, парсинг данныхЮ отправка смс на Delphi. … Как видите запросы везде одинаковые, по работе с MySQL с использованием Denwer я уделю еще – работа с Blob-полями и на этом закончим, так как все почти одинаковое. Исходник можно скачать тут. Автор статьи – Andrey53. Метки: apache, denwer, mysql, БД, хостинг. Автор: Andrey53 Базы данных, Сеть и интернет Подписаться на RSS ленту … […]

  2. teran:

    при прочтении заголовков статей возникает некоторое недоумение.
    «работа с mysql с использованием denwer» (с).
    Давайте определимся, по факту (содержимому статьи) описана работа с mySQL из делфи с использованием компонентов MyDAC (компоненты хорошие, правда платные(: ). таким образом денвер тут вообще ни при чем. денвер это связка апач+пхп+mysql на локальной машине. Т.е по факту это инструмент вэб разработчика (эстета причем ибо обычно все же пишут с использованием *nix систем. ибо пхп под виндовз в печь.)
    Т.е если говорим про mySQL + delphi то и статьи давайте будем называть так же.

    что касается кусков кода в статье. присмотритесь к выражению
    if Form1.MyConnection1.Connected=True then
    flagConnect:=True
    else
    flagConnect:=False;

    тут есть две мудрености, абсолютно не нужные в коде. Этим вы только запутываете код. Во первых: посмотри не выражение
    if …connected = true then
    в операторе if вы указываете булевое выражение, выражение это равно результату сравнение connected и true, connected это такое же булевое свойство. не надо его сравнивать с true или false. результат всегда однозначен.
    если connected у нас true то сравниваем true = true результат естественно true.
    если connected у нас false то сравнение false = true дает false. Т.е сравнение вообще не нужно.
    пишем просто if …connected then … просто и понятно.
    даже по русски если читать «если соединение.подключено = правда то … »
    логично-то просто видеть «если подключено то» на то они и есть булевые свойства.

    ну и второй вопрос здесь же. Зачем писать код вида
    Если true то flag := true
    иначе (т.е false) flag := false;
    будьте проще flagConnected := myConnection1.connected;

    причем это касается не только булевых значений.
    например код if a = 1 then flag := true else flag := false
    можно заменить flag := (a = 1);

    а чтобы запустить в отдельном потоке коннект к БД (если это единственное предназначение потока), не обязательно описывать класс этого потока, создавать его экземпляр и т.п достаточно просто запустить функцию на выполнение в этом потоке. суть конечно от этого не изменится, но выглядеть будет компактней.

  3. teran:

    писать
    try
    ThreadConnect:=TMyThreadConnect.Create(False);
    ThreadConnect.Resume;
    except
    on e:Exception do
    end;

    тоже не есть корректно. во-первых, если вы сразу после создания запускаете поток на выполнение, то зачем создавать его спящим?
    а во вторых, какие исключения призван обрабатывать блок try ? исключения потока? дак они здесь никогда не отловятся. данный блок кода закончится уже давно, вместе с блоком try except а поток там будет до сих пор коннектиться к БД. т.е исключения потока надо в самом потоке и обрабатывать. Если конечно, вы хотите словить эксепшен коннекта к БД. Однако если вы хотите обработать исключения создания потока Create (которое может в принципе возникнуть) то претензий нет.

    так же по поводу sql запросов.
    зачем писать sql.clear а потом sql.add(‘….’)
    вписывайте просто sql.text := ‘…’
    старое содержимое будет перезаписано, новое вписано. никаких лишних непонятных действий.

    удачи (:

  4. Daria:

    The Most Profitable Mail Order Business Of Them All…

    https://zaokomtek.ru/?p=330

  5. hexkey:

    Почему именно денвер? Это ж самая отсталая сборка (под самую отсталую ОСь) вебсервера… Там какой то мускуль особый?
    Не могу не высказаться против вражьего продукта: на сях работа с мускулем выглядит куда более элегантно… ;)

  6. samsim:

    Интересное решение. Для этого наверное протребуется много выдержки. А статейка полезная и ваш опыт впечетляет.

Оставить комментарий

Вы можете использовать следующие теги:

*