IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
WAKE-UP
- Сообщения: 20
- Зарегистрирован: 17 ноя 2004, 12:26
Сообщение
WAKE-UP » 03 дек 2004, 17:02
схема такова:
DataModule в основном потоке
SQLConnection <- SQLQuery <-DataSetProvider<-ClientDataSet<-DataSource
Хочу выполнить SQL запрос в фоновом режиме. Как?
Код: Выделить всё
type
TSearchThread = class(TThread)
private
{ Private declarations }
FSQLquery: TSQLQuery;
protected
procedure Execute; override;
procedure MyTableOpen;
public
constructor MyCreate(ASQLQuery: TSQLQuery);
end;
.
.
.
constructor TSearchThread.MyCreate;
begin
inherited Create(true);
FreeOnTerminate := True;
Priority := tpNormal;
FSQLquery := ASQLQuery;
Resume;
end;
.
.
.
procedure TSearchThread.Execute;
begin
FSQLquery.Open;
end;
Только он Open проходит сразу, нифига ничего не ища ... Почему? SQL.Text нормальный, FSQLQuery.Connection.Name - установлен ...
FSQLQuery.Connection.Active = True !!!
Подскажите плиз !!!
-
eugeney
- Сообщения: 79
- Зарегистрирован: 29 окт 2004, 18:51
Сообщение
eugeney » 03 дек 2004, 19:01
WAKE-UP писал(а):схема такова:
DataModule в основном потоке
SQLConnection <- SQLQuery <-DataSetProvider<-ClientDataSet<-DataSource
Хочу выполнить SQL запрос в фоновом режиме. Как?
Подскажите плиз !!!
Ни как. Протокол общения IB/FB/Ya такой чтоне позволяет асинхронное выполнение запросов.
Для твоего случая нужно использовать собственное соединение с БД для каждого потока. Ситуацию спасает что возможно иметь одну транзакцию на несколько соединений с БД.
Путилин Евгений.
-
WAKE-UP
- Сообщения: 20
- Зарегистрирован: 17 ноя 2004, 12:26
Сообщение
WAKE-UP » 04 дек 2004, 14:07
У меня:
Код: Выделить всё
TMyThread.Create(Query: TSQLQuery);
begin
FQuery := Query;
end;
TMyThread.Execute;
begin
FQuery.Open;
end;
Пролетает "на ура" - без ошибок и вообще признака живости !!!
-
WAKE-UP
- Сообщения: 20
- Зарегистрирован: 17 ноя 2004, 12:26
Сообщение
WAKE-UP » 05 дек 2004, 14:56
Код: Выделить всё
TSearchThread = class(TThread)
private
{ Private declarations }
FSQLConnection: TSQLConnection;
FSQLQuery: TSQLQuery;
protected
procedure Execute; override;
procedure MyTableOpen;
public
constructor MyCreate(ASQLConnection: TSQLConnection; ASQLQuery: TSQLQuery);
destructor Destroy; override;
end;
constructor TSearchThread.MyCreate;
begin
inherited Create(true);
FreeOnTerminate := True;
Priority := tpNormal;
FSQLConnection := TSQLConnection.Create(nil);
FSQLConnection.ConnectionName := 'ibconnection';
FSQLConnection.Params.Assign(ASQLConnection.Params);
MessageBox(0, PChar(FSQLConnection.Params.Text),'',0);
FSQLConnection.DriverName := 'Interbase';
FSQLConnection.LibraryName := 'dbexpint.dll';
FSQLConnection.VendorLib := 'gds32.dll';
FSQLConnection.GetDriverFunc := 'getSQLDriverINTERBASE';
FSQLConnection.LoginPrompt := false;
FSQLConnection.Open;
FSQLQuery := TSQLQuery.Create(nil);
FSQLQuery.SQLConnection := FSQLConnection;
FSQLQuery.SQL.Assign(ASQLQuery.SQL);
MessageBox(0, PChar(FSQLQuery.SQL.Text), '', 0);
FSQLQuery.Open;
if FSQLConnection.Connected then MessageBox(0, 'Connected', '', 0) else MessageBox(0, 'Not connected', '', 0);
//Resume;
end;
коннект говорит что Connected, но SQLQuery не хочет выполняться.
Объясните почему пожалуйста
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 06 дек 2004, 10:44
ну ребята, прямо как дети малые - вам что, компьютер говорит "не хочу выполнять запрос"? Если выдает сообщение об ошибке - ну так напиши, КАКОЕ? Учитесь понятно объяснять свои проблемы, чтобы вам помогли. Иначе ваши проблемы так и останутся проблемами.
-
WAKE-UP
- Сообщения: 20
- Зарегистрирован: 17 ноя 2004, 12:26
Сообщение
WAKE-UP » 06 дек 2004, 12:51
Повторюсь что и в первом посте было:
При выполнении методо open объекта TSQLQuery корректно на 100% заполненного и проверянного для него SqlQuery.Connection.Connected = true, реакции сервера Firebird 1.5 никакой - шуршание по 250 000 записей нет (специально сделан запрос по NATURAL). SQLQuery - пуст.
Сообщений об ошибках - никаких !!!
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 06 дек 2004, 13:19
смотрим пример bkquery из Delphi. там для BDE, для dbExpress должно быть то же самое. кроме того, коннект должен происходить в главном thread, а не в создаваемом тобой.
-
eugeney
- Сообщения: 79
- Зарегистрирован: 29 окт 2004, 18:51
Сообщение
eugeney » 06 дек 2004, 16:05
WAKE-UP писал(а):Повторюсь что и в первом посте было:
При выполнении методо open объекта TSQLQuery корректно на 100% заполненного и проверянного для него SqlQuery.Connection.Connected = true, реакции сервера Firebird 1.5 никакой - шуршание по 250 000 записей нет (специально сделан запрос по NATURAL). SQLQuery - пуст.
Сообщений об ошибках - никаких !!!
Может все дело в dbExpress?
Можеш попробовать тоже самое на BDE или на FIB+?
Путилин Евгений.