Calculated field gibi davranan bir field inşa etmek (MySQL)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ertank
Üye
Mesajlar: 982
Kayıt: 11 Eyl 2015 11:45

Re: Calculated field gibi davranan bir field inşa etmek (MySQL)

Mesaj gönderen ertank » 26 Kas 2017 03:51

Test ettiğim kadarıyla STORED şeklinde olsa dahi GENERATED türündeki kolon verileri yedeğe dahil edilmiyor. Bununla birlikte MySQL yedeğini program içinden almak için aşağıdaki gibi bir kod kullanılabilir:

Kod: Tümünü seç

function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of AnsiChar;
  BytesRead: Cardinal;
  WorkDir: string;
  Handle: Boolean;
begin
  Result := '';
  with SA do begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
  try
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    WorkDir := Work;
    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                            nil, nil, True, 0, nil,
                            PChar(WorkDir), SI, PI);
    CloseHandle(StdOutPipeWrite);
    if Handle then
      try
        repeat
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
          if BytesRead > 0 then
          begin
            Buffer[BytesRead] := #0;
            Result := Result + string(Buffer);
          end;
        until not WasOK or (BytesRead = 0);
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;
Kaynak: https://stackoverflow.com/questions/911 ... delphi-app

Kullanımı aşağıdaki şekilde olacaktır:

Kod: Tümünü seç

var
  Dump: TStringList;
begin
  Dump := TStringList.Create();
  try
    Dump.Text := GetDosOutput('"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe" -u<kullanıcı> -p<şifre> <database> 2>nul');
    Dump.SaveToFile(FormatDateTime('yyyy-mm-dd_hh.nn', Now()) + '.sql');
    ShowMessage('Yedekleme tamamlandı');
  finally
    Dump.Free();
  end;
Eğer son sürümlerden bir Delphi kullanıyor isterseniz TZipFile sınıfını kullanarak yerden kazanmak için yedeği sıkıştırmanız mümkün.

Kod: Tümünü seç

uses
  Zip;

var
  Dump: TStringStream;
  ZipFile: TZipFile;
  FileName: string;
begin
  FileName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) +  FormatDateTime('yyyy-mm-dd_hh.nn', Now()) + '.zip';
  ZipFile := TZipFile.Create();
  try
    if FileExists(FileName) then DeleteFile(FileName);
    ZipFile.Open(FileName, zmWrite);

    Dump := TStringStream.Create(GetDosOutput('"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe" -u<kullanıcı> -p<şifre> <database> 2>nul'));
    try
      ZipFile.Add(Dump, ChangeFileExt(ExtractFileName(FileName), '.sql'));
      ZipFile.Close();
      ShowMessage('Yedekleme tamamlandı');
    finally
      Dump.Free();
    end;
  finally
    ZipFile.Free();
  end;
end;
Not: Eğer sıkıştırılmamış yedek boyutu 1GB gibi bir değere ulaşır ise mysqldump.exe'ye direk dump dosyasını yazması şeklinde bir parametre vermek daha anlamlı olacaktır. Uygulama windows hafıza kullanım limitlerine takılabilir.

fatihbarut
Üye
Mesajlar: 391
Kayıt: 15 Ara 2011 08:02

Re: Calculated field gibi davranan bir field inşa etmek (MySQL)

Mesaj gönderen fatihbarut » 26 Kas 2017 06:44

mysqldump.exe delphi altından shellexecute ve commandline parametreleri ile çalışmamak konusunda ciddi ısrar ediyor.

örneğin şu işe yaramıyor

ShellExecute(handle, 'open',
PChar('C:\mysqldump.exe'),
PChar('--user=root --password=benimpassword benimdatabase > C:\benimbackup.sql'), '', SW_SHOWNORMAL);

fatihbarut
Üye
Mesajlar: 391
Kayıt: 15 Ara 2011 08:02

Re: Calculated field gibi davranan bir field inşa etmek (MySQL)

Mesaj gönderen fatihbarut » 26 Kas 2017 06:50

Hacı abi getdosoutput yaz gününde dondurma gibi geldi :)
Allah razı olsun
tam aynı yerden bulmuş deniyordum senin mesajı gördüm.

Edit: Yalnız ben şöyle yaptım

Memo1.Text := GetDosOutput('"C:\BenimProgram\system\mysqldump.exe" -uroot -pBenimSifre BenimDatabase > C:\BenimProgram\YedekDB\'+FormatDateTime('yyyy-mm-dd_hh.nn', Now()) +'.sql');

Cevapla