Форум: "Базы";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];
ВнизПопытка осуществления парр-ного потокобезопасного доступа к БД + Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c