SQL запрос в отдельнгом потоке (dbExpress) как?

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
WAKE-UP
Сообщения: 20
Зарегистрирован: 17 ноя 2004, 12:26

SQL запрос в отдельнгом потоке (dbExpress) как?

Сообщение 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

Re: SQL запрос в отдельнгом потоке (dbExpress) как?

Сообщение 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+?

Путилин Евгений.

Ответить