Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > асинхронное соединение с MySQL


Автор: nomadminded 10.1.2007, 12:50
доброго времени суток. помогите пожалуйста, никак не могу разобраться.
пробую установить асинхронное соединение с MySQL из delphi через ADODB библиотеку (ADOConnection.ConnectOptions:=coAsyncConnect;  ADOCommand1.ExecuteOptions:=[eoAsyncExecute];)
посылаю на сервер большой SQL (INSERT) с помощью ADOCommand.Execute и продолжаю работать, пока он там выполняется. как мне узнать, что он закончил выполнение? каким образом можно это проверить?
спасибо заранее.

Автор: Mephisto 10.1.2007, 13:09
А у тебя блокирутся таблица для чтения при вставке? Если нет, то думаю, никак.

Автор: drkot 10.1.2007, 13:14
можно попробовать запросить запись по ключевому полю через тот же command. Если запись есть то запрос соответственно завершился.
Есть еще такое понятие как список транзакций на сервере, по ним наверно можно. Но я с таким не работал.

Автор: SergeBS 10.1.2007, 15:04
Mephisto, 
drkot, 
ну что вы, право...

nomadminded, 
ADOCommand - F1 - свойство States. А у более других есть еще и events на разные события такого духа.

Автор: nomadminded 10.1.2007, 15:19
re: SergeBS

со states не очень понимаю как работать, не могли бы вы коротенький примерчик набросать?

Автор: SergeBS 10.1.2007, 15:45
nomadminded, 
Ну нахал... В доке же все прозрачно описано. Навскидку:
Код

if ADOCommand1.States = stExecuting then 
  showmessage('Connection object is currently executing.');


"Hello, world" написать не пробовал? smile

Автор: drkot 10.1.2007, 15:57
SergeBS, ну так это позволяет просто контролировать есть транзакция на сервере или нет.
Их же десяток в очереди висеть может. Как я понимаю надо определить состояние конкретной.

Автор: nomadminded 10.1.2007, 16:21
re:SergeBS, 

такое уже давно пробовала:
while form1.ADOCommand1.States = stExecuting do;
выдает ошибку [Error] Unit1.pas(259): E2008 Incompatible types и даже не компилится.

Автор: nomadminded 10.1.2007, 20:23
все, спасибо, разобралась.

Автор: SergeBS 11.1.2007, 09:36
nomadminded, 
Осталось для завершения:
1. Показать решение.
2. Закрыть тему (галочку поставить).

Автор: drkot 11.1.2007, 17:38
SergeBS, а зачем? Он то уже разобрался.  smile 
Теперь только при возникновении очередных проблем прибежит.

Автор: nomadminded 11.1.2007, 19:07
re:SergeBS, 
решение на самом деле легкое. но вот где-то у меня в этом коде образуется мемлик..
Код

while form1.ADOCommand1.States = [stExecuting] do;
Form1.ADOCommand1.CommandText:=command;
Form1.ADOCommand1.Execute;

не могу понять где  smile 
может кто что подскажет?

пс. насчет галочки - сорри, я тут новенькая. как разберусь окончательно - влеплю обязательно.

Автор: SergeBS 11.1.2007, 19:41
nomadminded, 
Что такое мемлик? просто не понял.

Автор: nomadminded 11.1.2007, 19:49
сорри, memory leak.

обнаружила, что он образуется при 
Код
ADOCommand1.ExecuteOptions:=[eoAsyncExecute];


при отсутствии асинхронности мемлика нет..
any ideas?

Автор: SergeBS 12.1.2007, 08:29
nomadminded, 
Цитата
memory leak.

Нда. Неприятно. Подробнее изложи, какая версия Delphi и стоят ли updates, версия MDAC, чем утечка обнаружена. Навскидку - тут может повлиять ADOcommand.Close после выполнения. Но это так, совсем навскидку...

Автор: Mephisto 12.1.2007, 09:49
Цитата(nomadminded @  11.1.2007,  20:49 Найти цитируемый пост)
обнаружила, что он образуется при 
ADOCommand1.ExecuteOptions:=[eoAsyncExecute];

Ужоснах. Странно. Никогда не сталкивался.

Проверил у себя. Та же фигня. Помогло только при FreeAndNil... smile Но так думаю тебе это не подходит.  smile 

Автор: SergeBS 12.1.2007, 10:22
Я тут маленько почесал репу smile, и начесал такое: при асинхронном соединении должны  выделяться дополнительные ресурсы на эту асинхронность. Соответственно при переключении назад они вроде должны высвободиться. Может поможет? Попробуйте.

Автор: nomadminded 12.1.2007, 21:04
вообщем убрала я эту асинхронность и залила себе преспокойненько все 100 млн записей, чуть помедленнее, но все же без всяких утечек. 

Цитата(SergeBS @  12.1.2007,  10:22 Найти цитируемый пост)
Я тут маленько почесал репу smile, и начесал такое: при асинхронном соединении должны  выделяться дополнительные ресурсы на эту асинхронность. Соответственно при переключении назад они вроде должны высвободиться. Может поможет? Попробуйте. 


тут вы имели ввиду убирать значок асинхронности в ExecuteOptions? вряд ли помогло бы, имхо, хотя могу и ошибаться.
но вообщем-то, думаю, пора закрывать тему. данные залиты, преступаем к обработке (:

ждите меня скоро с новыми вопросами!   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)