Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.28;
Скачать: CL | DM;

Вниз

Попытка осуществления парр-ного потокобезопасного доступа к БД +   Найти похожие ветки 

 
DBDev   (2003-07-04 14:17) [0]

Схема такая: TSession, TADOQuery, TDataSource.

Рисуется класс:
class TQryThread: public TThread {
private:
TSession *FSession;
TADOQuery *FQuery;
TDataSource *FDataSource;
TForm *XForm;
Exception *FQueryException;
void __fastcall ConnectDataSource();
void __fastcall ShowQryError();
protected:
virtual void __fastcall Execute();
public:
__fastcall TQryThread(TSession *Session, TADOQuery *Query, TDataSource *DataSource, TForm *Form);
};


И его имплементация:

//---------------------------------------------------------------------------
void __fastcall TQryThread::ConnectDataSource()
{
FDataSource->DataSet = FQuery;
XForm->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TQryThread::ShowQryError()
{
Application->ShowException(FQueryException);
}
//---------------------------------------------------------------------------
__fastcall TQryThread::TQryThread(TSession *Session, TADOQuery *Query, TDataSource *DataSource, TForm *Form) :TThread(true)
{
FSession = Session;
FQuery = Query;
FDataSource = DataSource;
XForm = Form;
XForm->Enabled = false;
FreeOnTerminate = true;
Resume();
}
//---------------------------------------------------------------------------
void __fastcall TQryThread::Execute()
{
try {
FQuery->Open();
Synchronize(ConnectDataSource);
}
catch (Exception *E) {
FQueryException = E;
Synchronize(ShowQryError);
}
}
//---------------------------------------------------------------------------


Далее паралельно организуется одновременное открытие различных запросов:

CForm->BQuery->Close();
CForm->BQuery->SQL->Text = sSQL;
TQryThread *CQTD = new TQryThread(CForm->BudjetsSession, CForm->BQuery, CForm->BDS, MForm);


Результат - ошибка, занятости при одновременном окрытии более одного запроса.
В последовательном случае все работает изрядно быстро и качественно. Как я предполагаю проблема в том, что невозможно определить принадлежность объекта TSession определенному объекту TADOQuery, потому как у последнего, в отличии от TQuery отсутствует свойство SessionName.

Вопрос: как быть? Неужели переделывать огромный проект с TADOQuery на TQuery и переводить все из ADO в BDE?


 
Polevi ©   (2003-07-04 14:40) [1]

зачем TSession ?

Thread.Execute
begin
CoInitialize(nil);
try
conn:=TADOConnection.Create(nil);
qry:=TADOQuery.Create(nil);
try
qry.Connection:=conn;
qry.SQL.Add("SELECT * FROM BlaBla");
qry.Open;
...
...
finally
qry.Free;
conn.Free;
end;
finally
CoUninitialize;
end;

end;



Страницы: 1 вся ветка

Текущий архив: 2003.07.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.014 c
6-91784
KasAlex
2003-05-22 10:12
2003.07.28
Сокеты. Соединение по порту 80 (HTTP)


11-91701
/-\|e}{
2002-11-21 12:49
2003.07.28
KOLGIF


6-91797
exciter__
2003-05-22 14:31
2003.07.28
Проблема с модемом (определить поднятие трубки)


14-91846
Крот
2003-07-11 06:36
2003.07.28
Рекомендую заглянуть


4-91958
TaveL
2003-05-23 21:50
2003.07.28
Использование GetFontResourceInfo