Страница 1 из 1

Lst connection ->connect=erorr

Добавлено: Пт 16 дек 2011 11:24
imobile
Здравствуйте.
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)
Как правильно сделать, чтоб соединение оставалось подключенным? Или надо перед каждым вызовом проверять подключен? Но по идеи это должен делать компонент сам

Добавлено: Пт 16 дек 2011 15:46
AndreyZ
Здравствуйте,

Для восстановления соединения после его потери Вам следует использовать событие 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.

Добавлено: Пт 16 дек 2011 18:01
imobile
Вроде работает, спасибо.

Re: Lst connection ->connect=erorr

Добавлено: Ср 30 сен 2015 09:57
mserg1972
А можете подсказать решение той же проблемы но на языке паскаль?
Delphi7
MyDac7
MySql 5.6
Win7 64

Re: Lst connection ->connect=erorr

Добавлено: Ср 30 сен 2015 09:59
mserg1972
Сам что то наваял, но понимаю что неправильно

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.

Re: Lst connection ->connect=erorr

Добавлено: Пн 05 окт 2015 09:39
ViktorV
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.