unit uDBConnection;

interface

uses
  SysUtils, Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf,
  FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait, Data.DB,
  FireDAC.Comp.Client, FireDAC.Phys.MySQLDef, FireDAC.Phys.MySQL,Vcl.Dialogs;

type
  TDBConnection = class(TDataModule)
    FDConnection: TFDConnection;
    FDPhysMySQLDriverLink: TFDPhysMySQLDriverLink;
  private
    procedure AddConnectionDef(Sender: TObject);
    { Private declarations }



  public
    { Public declarations }

    function Connect: boolean;

    function Connect2:boolean;


  end;

function DBConnection: TDBConnection;

implementation

{$R *.dfm}

uses
  UniGUIVars, uniGUIMainModule, MainModule;

function DBConnection: TDBConnection;
begin
  Result := TDBConnection(UniMainModule.GetModuleInstance(TDBConnection));
end;

{ TDBConnection }

function TDBConnection.Connect: boolean;
var oParams:TStrings;  ErrorInfo:string;

begin



 oParams:=TStringList.Create;


 try

  oParams.Add('DataBase=smsmessendger_db');
  oParams.Add('Password=masterkey');
  oParams.Add('User_Name=root');
  oParams.Add('Port=3306');
  oParams.Add('Server=localhost');
  oParams.Add('CharacterSet=utf8');

  FDConnection.Params.Assign(oParams);
  FDConnection.DriverName:='MySQL';



   //Пробуем подключиться

   try

   FDConnection.Connected:=true;

   if FDConnection.Connected then

     begin
     Result:=true;

     //showmessage('Connected');
     end else Result:=false;



   except



   on E: EFDDBEngineException do

    case E.Kind of
    ekUserPwdInvalid:


       // user name or password are incorrect
       raise Exception.Create('DBConnection Error. User name or password are incorrect'+
       #13#10+#13#10+E.ClassName+' поднята ошибка, с сообщением : '+E.Message);



    ekUserPwdExpired:


      raise Exception.Create('DBConnection Error. User password is expired'
    +#13#10+#13#10+E.ClassName+' поднята ошибка, с сообщением : '+E.Message);



    ekServerGone:



      raise Exception.Create('DBConnection Error. DBMS is not accessible due to some reason'
      +#13#10+#13#10+E.ClassName+' поднята ошибка, с сообщением : '+E.Message);




    else                // other issues



      raise Exception.Create('DBConnection Error. UnknownMistake'
      +#13#10+#13#10+E.ClassName+' поднята ошибка, с сообщением : '+E.Message);





    end;

    on E : Exception do

      raise Exception.Create(
      E.ClassName+' поднята ошибка, с сообщением : '+#13#10+#13#10+E.Message
      );





   end;




 finally

  FreeAndNil(oParams);

 end;


end;

function TDBConnection.Connect2: boolean;
begin
//




   //Пробуем подключиться

   try

   Self.AddConnectionDef(Self);
   FDConnection.ConnectionDefName:='MySQL_Persistent_def';
   FDConnection.Connected:=true;


   if FDConnection.Connected then

     begin
     Result:=true;

     //showmessage('Connected');
     end else Result:=false;



   except



   on E: EFDDBEngineException do

    case E.Kind of
    ekUserPwdInvalid:


       // user name or password are incorrect
       raise Exception.Create('DBConnection Error. User name or password are incorrect'+
       #13#10+#13#10+E.ClassName+' поднята ошибка, с сообщением : '+E.Message);



    ekUserPwdExpired:


      raise Exception.Create('DBConnection Error. User password is expired'
    +#13#10+#13#10+E.ClassName+' поднята ошибка, с сообщением : '+E.Message);



    ekServerGone:



      raise Exception.Create('DBConnection Error. DBMS is not accessible due to some reason'
      +#13#10+#13#10+E.ClassName+' поднята ошибка, с сообщением : '+E.Message);




    else                // other issues



      raise Exception.Create('DBConnection Error. UnknownMistake'
      +#13#10+#13#10+E.ClassName+' поднята ошибка, с сообщением : '+E.Message);





    end;

    on E : Exception do

      raise Exception.Create(
      E.ClassName+' поднята ошибка, с сообщением : '+#13#10+#13#10+E.Message
      );





   end;



end;



procedure TDBConnection.AddConnectionDef(Sender: TObject);
var myDef:IFDStanConnectionDef; i:integer;
begin


 with UniMainModule do begin


//Проверяем нет ли уже ConnDef с таким же именем
   for i := 0 to FDManager.ConnectionDefs.Count-1 do
   begin
     if FDManager.ConnectionDefs[i].Name='MySQL_Persistent_def'
     then exit;
   end;


//Далее, добавляем, если ConnDef c именем MySQL_Persistent_def отсутствует

   myDef:=FDManager.ConnectionDefs.AddConnectionDef;
   myDef.Name:='MySQL_Persistent_def';
   myDef.Params.DriverID:='MySQL';
   myDef.Params.Database:='smsmessendger_db';
   myDef.Params.UserName:='root';
   myDef.Params.Password:='masterkey';


   // Далее другая техника добавления параметров
   myDef.Params.Add('Server=127.0.0.1'); // << я не нашел в свойствах Server, поэтому добавил так
   myDef.Params.Add('Port=3306');
   myDef.Params.Add('CharacterSet=utf8');


   // Отмечаем myDef как Persistent, без этого был бы Private
   myDef.MarkPersistent;

   // Сохраняем изменения в файле FDConnectionDefs.ini
   myDef.Apply;

 end;


end;

initialization
  RegisterModuleClass(TDBConnection);

end.
