В прошлой статье по работе с базой данных 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
[…] Andrey53 пишет: Delphi, idhttp, работа с сетью в delphi, adoquery< adoconnection, парсинг данныхЮ отправка смс на Delphi. … Как видите запросы везде одинаковые, по работе с MySQL с использованием Denwer я уделю еще – работа с Blob-полями и на этом закончим, так как все почти одинаковое. Исходник можно скачать тут. Автор статьи – Andrey53. Метки: apache, denwer, mysql, БД, хостинг. Автор: Andrey53 Базы данных, Сеть и интернет Подписаться на RSS ленту … […]
при прочтении заголовков статей возникает некоторое недоумение.
«работа с 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);
а чтобы запустить в отдельном потоке коннект к БД (если это единственное предназначение потока), не обязательно описывать класс этого потока, создавать его экземпляр и т.п достаточно просто запустить функцию на выполнение в этом потоке. суть конечно от этого не изменится, но выглядеть будет компактней.
писать
try
ThreadConnect:=TMyThreadConnect.Create(False);
ThreadConnect.Resume;
except
on e:Exception do
end;
тоже не есть корректно. во-первых, если вы сразу после создания запускаете поток на выполнение, то зачем создавать его спящим?
а во вторых, какие исключения призван обрабатывать блок try ? исключения потока? дак они здесь никогда не отловятся. данный блок кода закончится уже давно, вместе с блоком try except а поток там будет до сих пор коннектиться к БД. т.е исключения потока надо в самом потоке и обрабатывать. Если конечно, вы хотите словить эксепшен коннекта к БД. Однако если вы хотите обработать исключения создания потока Create (которое может в принципе возникнуть) то претензий нет.
так же по поводу sql запросов.
зачем писать sql.clear а потом sql.add(‘….’)
вписывайте просто sql.text := ‘…’
старое содержимое будет перезаписано, новое вписано. никаких лишних непонятных действий.
удачи (:
The Most Profitable Mail Order Business Of Them All…
https://zaokomtek.ru/?p=330…
Почему именно денвер? Это ж самая отсталая сборка (под самую отсталую ОСь) вебсервера… Там какой то мускуль особый?
Не могу не высказаться против вражьего продукта: на сях работа с мускулем выглядит куда более элегантно…
Интересное решение. Для этого наверное протребуется много выдержки. А статейка полезная и ваш опыт впечетляет.
спасибо, обращайтесь