Lst connection ->connect=erorr

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Закрыто
imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Lst connection ->connect=erorr

Сообщение imobile » Пт 16 дек 2011 11:24

Здравствуйте.
builder xe
mysql5.5
win7 64
MyDac 7.0.1

Если долго ничего не делать, то теряется соединение. Я попытался решить проблему следующим образом

Код: Выделить всё

void __fastcall TForm2::MyConnection2AfterDisconnect(TObject *Sender)
{
MyConnection2->Connect();
}
, но при выходе из программы всегда выскакивает ошибка
First chance exception at $75D0B727. Exception class EAccessViolation with message 'Access Violation'. Process Project1.exe (3348)
Как правильно сделать, чтоб соединение оставалось подключенным? Или надо перед каждым вызовом проверять подключен? Но по идеи это должен делать компонент сам

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Сообщение AndreyZ » Пт 16 дек 2011 15:46

Здравствуйте,

Для восстановления соединения после его потери Вам следует использовать событие OnConnectionLost. Следующий пример демонстрирует эту функциональность:

Код: Выделить всё

//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  MyConnection1->Options->LocalFailover = True; // необходимо для работы события OnConnectionLost
  MyConnection1->Open();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyConnection1ConnectionLost(TObject *Sender, TComponent *Component,
		  TConnLostCause ConnLostCause, TRetryMode &RetryMode)
{
  RetryMode = rmReconnectExecute;
}
Более подробную информацию Вы можете найти в документации MyDAC.

imobile
Сообщения: 103
Зарегистрирован: Сб 12 ноя 2011 00:12

Сообщение imobile » Пт 16 дек 2011 18:01

Вроде работает, спасибо.

mserg1972
Сообщения: 2
Зарегистрирован: Ср 30 сен 2015 09:54

Re: Lst connection ->connect=erorr

Сообщение mserg1972 » Ср 30 сен 2015 09:57

А можете подсказать решение той же проблемы но на языке паскаль?
Delphi7
MyDac7
MySql 5.6
Win7 64

mserg1972
Сообщения: 2
Зарегистрирован: Ср 30 сен 2015 09:54

Re: Lst connection ->connect=erorr

Сообщение mserg1972 » Ср 30 сен 2015 09:59

Сам что то наваял, но понимаю что неправильно

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBAccess, MyAccess, MemDS;

type
TForm1 = class(TForm)
MyDB1: TMyConnection;
Myq1: TMyQuery;
Myq2: TMyQuery;
Mys1: TMyDataSource;
Mys2: TMyDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure MyDB1ConnectionLost(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
//MyDB1.LoginPrompt := False;
MyDB1.Options.LocalFailover:=True;
MyDB1.Options.Charset := 'cp1251';
MyDB1.Server := '4.101.152.112';
MyDB1.Port := 3306;
MyDB1.Database := 'v91490ey_video';
MyDB1.Username := 'v91490ey_video';
MyDB1.Password := '455555';
try
MyDB1.Open
except
ShowMessage('Не удалось установить соединение');
Exit;
end;
Myq1.Open;
Myq2.Open;
end;
procedure TForm1.FormClick(Sender: TObject);
begin
MyDB1.Open
end;

procedure TForm1.MyDB1ConnectionLost(Sender: TObject);
begin
RetryMode = rmReconnectExecute;
end;
end.

ViktorV
Devart Team
Сообщения: 212
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Lst connection ->connect=erorr

Сообщение ViktorV » Пн 05 окт 2015 09:39

1. Чтобы использовать обработчик события OnConnectionLost, вы должны добавить модуль MemData в раздел uses Вашего модуля.
2. В вашем примере неправильно определен созданный вами обработчик события OnConnectionLost. Вам следует заменить:

Код: Выделить всё

procedure MyDB1ConnectionLost(Sender: TObject); 
на:

Код: Выделить всё

procedure MyDB1ConnectionLost(Sender: TObject; Component: TComponent;
      ConnLostCause: TConnLostCause; var RetryMode: TRetryMode
);
и соответственно:

Код: Выделить всё

procedure TForm1.MyDB1ConnectionLost(Sender: TObject);
begin
  RetryMode = rmReconnectExecute;
end;
на:

Код: Выделить всё

procedure TForm1.MyDB1ConnectionLost(Sender: TObject; Component: TComponent;
  ConnLostCause: TConnLostCause; var RetryMode: TRetryMode);
begin
  RetryMode = rmReconnectExecute;
end;
3. В процедуре TForm1.FormCreate вам следует присвоить обработчику события OnConnectionLost компонента TMyConnection созданный вами обработчик:

Код: Выделить всё

  MyDB1.OnConnectionLost := MyDB1ConnectionLo
st;
Для корректного использования обработчика событий OnConnectionLost Вам следует изменить свой пример следующим образом:

Код: Выделить всё

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBAccess, MyAccess, MemDS, MemData;

type
TForm1 = class(TForm)
MyDB1: TMyConnection;
Myq1: TMyQuery;
Myq2: TMyQuery;
Mys1: TMyDataSource;
Mys2: TMyDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormClick(Sender: TObject);
procedure MyDB1ConnectionLost(Sender: TObject; Component: TComponent;
  ConnLostCause: TConnLostCause; var RetryMode: TRetryMode);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  //MyDB1.LoginPrompt := False;
  MyDB1.OnConnectionLost := MyDB1ConnectionLost;
  MyDB1.Options.LocalFailover:=True;
  MyDB1.Options.Charset := 'cp1251';
  MyDB1.Server := '4.101.152.112';
  MyDB1.Port := 3306;
  MyDB1.Database := 'v91490ey_video';
  MyDB1.Username := 'v91490ey_video';
  MyDB1.Password := '455555';
  try
   MyDB1.Open
  except
    ShowMessage('Не удалось установить соединение');
    Exit;
  end;
  Myq1.Open;
  Myq2.Open;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  MyDB1.Open
end;

procedure TForm1.MyDB1ConnectionLost(Sender: TObject; Component: TComponent;
  ConnLostCause: TConnLostCause; var RetryMode: TRetryMode);
begin
  RetryMode = rmReconnectExecute;
end;

end.

Закрыто