Хочу сделать reconnect к Master-Detail
Connection один на всех. Как и рекомендовалось в других ветках:
При обрыве связи на MainConnection.OnExecuteComplete:
| Код | ... function OpenConn: boolean; begin try Connection.Open; Result := true; except Result := false; end; end;
var i: Integer; List: TList; A: array of Boolean; strExecState: string; begin if (EventStatus = esErrorsOccured) and ((ErrorNumber = -2147467259) or (ErrorNumber = -2147217871)) then begin List := TList.Create; Application.CreateForm(TfrmConnectionState, frmConnectionState); frmConnectionState.Show; frmConnectionState.Repaint; try List := TList.Create; try SetLength(A,Connection.DataSetCount); for i := 0 to Connection.DataSetCount - 1 do begin List.Add(Connection.DataSets[i]); if Connection.DataSets[i].Active then A[i]:= true else A[i]:= false; end;
while Connection.DataSetCount > 0 do begin try Connection.DataSets[0].Connection := nil; except // STOP 1 on E: Exception do // тут возникает исключение // Cannot change the ActiveConnection property of a Recordset object which has a // Command object as its source begin Connection.DataSets[0].Active := false; Connection.DataSets[0].Connection := nil; end; end; end; Connection.Close;
while not OpenConn do Delay(4000);
for i := 0 to List.Count - 1 do TCustomADODataSet(List[i]).Connection := Connection;
for i := 0 to List.Count - 1 do begin if (A[i] = true) then begin try if not TCustomADODataSet(List[i]).Active then TCustomADODataSet(List[i]).Active := true; except // STOP 2 //Operation cannot be performed while executing asynchronously'; on E: Exception do begin showmessage(IntToStr(EOleException(E).ErrorCode)); end; end; end; end;
List.Clear; finally List.Free; A := nil; end; finally frmConnectionState.Close; FreeAndNil(frmConnectionState); end;
end end;
|
1) Открываю форму на которой в DBGridEh_master+DBGridEh_Detail1+DBGridEh_Detail2 и вывожу инфу из базы (MS SQL) 2) Вырубаю сеть. 3) В DBGridEh_master кликаю на следующую строку 4) Срабатывает MainConnection.OnExecuteComplete в котором видно что disconnect 5) Далее по тексту программы нарываюсь на STOP1 при попытке сделать Connection.DataSets[0].Connection := nil; для рекодсета в DBGridEh_Detail2 (Master и Detail1 нормально обнулили свой Connection) Если делать обнуление в цикле так:
| Код | if Connection.DataSets[0].Active then Connection.DataSets[0].Active := false; Connection.DataSets[0].Connection := nil;
|
то ошибок не возникает. 6) Врубаю сеть 7) Далее по тексту пытаюсь поднять Connection. Как только дохожу до Detail2 - нарываюсь на exception STOP2 (Master и Detail1 к этому моменту нормально восстановили свой Connection) 8) В итоге после Reconnect-a Master и Detail1 нормально восстановились а вот Detail2 - нивкакую не хочет (Detail2.Active = false и никаким боком в true не встаёт...):
Operation cannot be performed while executing asynchronously'
Не могу врубиться из-за чего ?
P.S. потоков не использую, ExecuteOptions=[] // асинхронный режим не включал |