Страница 1 из 1
SQL запрос в отдельнгом потоке (dbExpress) как?
Добавлено: 03 дек 2004, 17:02
WAKE-UP
схема такова:
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 !!!
Подскажите плиз !!!
Re: SQL запрос в отдельнгом потоке (dbExpress) как?
Добавлено: 03 дек 2004, 19:01
eugeney
WAKE-UP писал(а):схема такова:
DataModule в основном потоке
SQLConnection <- SQLQuery <-DataSetProvider<-ClientDataSet<-DataSource
Хочу выполнить SQL запрос в фоновом режиме. Как?
Подскажите плиз !!!
Ни как. Протокол общения IB/FB/Ya такой чтоне позволяет асинхронное выполнение запросов.
Для твоего случая нужно использовать собственное соединение с БД для каждого потока. Ситуацию спасает что возможно иметь одну транзакцию на несколько соединений с БД.
Путилин Евгений.
Добавлено: 04 дек 2004, 14:07
WAKE-UP
У меня:
Код: Выделить всё
TMyThread.Create(Query: TSQLQuery);
begin
FQuery := Query;
end;
TMyThread.Execute;
begin
FQuery.Open;
end;
Пролетает "на ура" - без ошибок и вообще признака живости !!!
Добавлено: 05 дек 2004, 14:56
WAKE-UP
Код: Выделить всё
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 не хочет выполняться.
Объясните почему пожалуйста
Добавлено: 06 дек 2004, 10:44
kdv
ну ребята, прямо как дети малые - вам что, компьютер говорит "не хочу выполнять запрос"? Если выдает сообщение об ошибке - ну так напиши, КАКОЕ? Учитесь понятно объяснять свои проблемы, чтобы вам помогли. Иначе ваши проблемы так и останутся проблемами.
Добавлено: 06 дек 2004, 12:51
WAKE-UP
Повторюсь что и в первом посте было:
При выполнении методо open объекта TSQLQuery корректно на 100% заполненного и проверянного для него SqlQuery.Connection.Connected = true, реакции сервера Firebird 1.5 никакой - шуршание по 250 000 записей нет (специально сделан запрос по NATURAL). SQLQuery - пуст.
Сообщений об ошибках - никаких !!!
Добавлено: 06 дек 2004, 13:19
kdv
смотрим пример bkquery из Delphi. там для BDE, для dbExpress должно быть то же самое. кроме того, коннект должен происходить в главном thread, а не в создаваемом тобой.
Добавлено: 06 дек 2004, 16:05
eugeney
WAKE-UP писал(а):Повторюсь что и в первом посте было:
При выполнении методо open объекта TSQLQuery корректно на 100% заполненного и проверянного для него SqlQuery.Connection.Connected = true, реакции сервера Firebird 1.5 никакой - шуршание по 250 000 записей нет (специально сделан запрос по NATURAL). SQLQuery - пуст.
Сообщений об ошибках - никаких !!!
Может все дело в dbExpress?
Можеш попробовать тоже самое на BDE или на FIB+?
Путилин Евгений.