Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Reconnect при обрыве связи (Master-Detail), ADO + MSSQL 
:(
    Опции темы
perceptron
Дата 3.6.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Хочу сделать 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=[] // асинхронный режим не включал
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.