![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как проверить наличие коннекции [D6, MSSQL]
jocko © (2003-01-31 11:24:00)Как проверить наличие коннекции, если она была установлена, а затем разорвана сервером (выгружен процесс на сервере, напр. из-за перегруженности или из-за плохой связи). перед отправкой очередного запроса, так чтобы иметь возможность выдать сообщение с предложением переконнектиться.
MS SQL, ADO?
jocko (2003-02-03 09:19:00) [1]Наверно не стоит, "connection sensor" вопервых будет забивать трафик не нужными вызовами, вовторых загружать сервер, теми же ненужными вызовами, а проблема именно с полохой связью и перегруженностью сервера (выгрузку спящих процессов на малозагруженном сервере никто делать не будет), в третьих запросы придется посылать через тот же Сonnection так что мешаться он всеравно будет...
Я сначала хотел сделать именно так, потом передумал.
BlackTiger (2003-01-31 19:06:00) [2]А если пойти дальше и круче?
Как сделать некий "connection sensor"?
Чтобы сидел на таймере и сообщал об обрыве связи сразу, при этом не мешая работать (на своей thread).
jocko (2003-01-31 17:10:00) [3]Спасибо, как до самого не дошло...
Darkwin (2003-01-31 15:48:00) [4]наверно так: (всё в том же событии)
if EventStatus=esErrorsOccured then
begin
// вроде номер дисконнекта = -2147467259, а может и нет, проверь
if Error.Number=-2147467259 then
ShowMessage("Disconnect");
EventStatus:= esOK; // чтобы не выскочила ошибка
end;
jocko (2003-01-31 14:54:00) [5]Хотел бы конкретизировать,
в этом обработчике уменя и так сидит нечто похожее, собственно только так я и показываю сообщение об ошибках сервера, все вызовы процедур сидят в try except.
Как определить именно обрыв связи?!!!
onWillExecute тоже не подходит (EventStatus всегда такой радостный esOk ,...), хотя в документации "Occurs after a database server signals acceptance of a command execution"
Darkwin (2003-01-31 13:41:00) [6]Напиши такой код:
procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection;
RecordsAffected: Integer; const Error: Error;
var EventStatus: TEventStatus; const Command: _Command;
const Recordset: _Recordset);
var
mes_ES,mes_RA,mes_err:String;
begin
if Error<>nil then
mes_err:=
"Error.Number="+IntToStr(Error.Number)+#10#13+
"Error.NativeError="+IntToStr(Error.NativeError)+#10#13+
"Error.Source="+Error.Source+#10#13+
"Error.Description="+Error.Description;
mes_RA:= "RecordsAffect="+IntToStr(RecordsAffected);
mes_ES:="EventStatus: " + GetEnumName(TypeInfo(TEventStatus), Ord(EventStatus));
MessageBox(Handle,PChar(mes_RA+#10#13#10#13+mes_err+#10#13#10#13+mes_ES),PChar("ADOConnection1ExecuteComplete"),MB_OK);
end;
запусти приложение, разорви связь с сервером потом восстанови, попытайся послать какой-нибудь запрос, и всё станет ясно...