Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Uygulama içinde FB DB bakımı
#1
Merhaba arkadaşlar.

FB veritabanını normalde gfix uygulaması ile bakım yaptırtıyorum. Fakat bu bazen kilitlenmelere neden oluyor. (Exe içinde shellexecute ile kod çalıştırıyorum 

ShellExecute(0, nil, 'cmd.exe', PWideChar('/C ' + 'gfix -validate db\2013.snc -user sysdba -password masterkey'), nil, SW_NORMAL); 
). 

ve bir işlem bitmeden diğerine geçtiği için bazen sıkıntılar yaşıyorum DB lock gibi.

Örneğin DB yedeğini almak için delphi uygulamam içinde TFDBackup componentini kullanıyorum.

(bu arada FDBackup component kullanımınıda vermiş olayım bilmeyenler için

    FDPhysFBDriverLink1.DriverID := 'FB';
    FDPhysFBDriverLink1.VendorLib := getcurrentdir() + '\fbclient.dll';
    Backup.UserName := 'SYSDBA';
    Backup.Password := 'masterkey';
    Backup.Database := adres + 'db.fdb';
    Backup.Verbose := True;
    Backup.Host := 'localhost';
    Backup.BackupFiles.Clear;

    Backup.BackupFiles.Add(adres + gun_ay_yil + '.fbk');
    Backup.Backup;
    TRY
      zipFile(adres + gun_ay_yil + '.zip', adres + gun_ay_yil + '.fbk');
      FINALLY DeleteFile(adres + gun_ay_yil + '.fbk');

    END;
    Showmessage('Oto yedek alma işlemi (HDD) başarıyla tamamlandı..');

)

Sorum şu: 
Uygulama içinde backup alma gibi db bakımı (sweep, validate, kill vs) yapan bir component var mıdır?
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#2
ShellExecute API'si yerine ShellExecuteEx API'sini kullanabilirsiniz. Bu sayede SHELLEXECUTEINFO yapısı içindeki hProcess üyesini; WaitForSingleObject API'si ile kullanabilir ve ShellExecuteEx ile çalıştırdığınız uygulamanın bitmesini bekleyebilirsiniz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
Yakın zamanda benim de benzer bir fonksiyona ihtiyacım olmuştu, şöyle bir şey işinize yarayabilir.

unit OrtakUnit_;

interface

/// <summary>
///  Temelde Konsol uygulamalarını "Parametreleriyle birlikte" çalıştırılabilmesini VE o prosesin bitmesini veya sonlanmasını bekleyebilir. Bekleme anlamında ShellExecute'nin biraz daha gelişmişidir.
/// </summary>
/// <remarks>
///  Hata kodlarının anlamları için şurayı inceleyin; 
///  <seealso>https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes</seealso>
/// </remarks>
/// <remarks>
///  API döküğmantasyonu için şuraya bakın; 
///  <seealso>https://docs.microsoft.com/tr-tr/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa?redirectedfrom=MSDN</seealso>
/// </remarks>
function ShellWait(const aTamUygulamaYolu, aParametreler: string; aKlasor: string; aSonlandirilanaKadarBekle, aBostaKalanaKadarBekle, aMinimumdaCalis: boolean; var aHataKodu: integer): boolean;

implementation

uses
    Winapi.Windows
  , System.SysUtils
  , Vcl.Forms
  ;

function ShellWait(const aTamUygulamaYolu, aParametreler: string; aKlasor: string; aSonlandirilanaKadarBekle, aBostaKalanaKadarBekle, aMinimumdaCalis: boolean; var aHataKodu: integer): boolean;
var
  S: String;
  SI: TStartupInfo;
  PI: TProcessInformation;
  CalismaKlasoru: PChar;
begin
  aHataKodu := NO_ERROR;
  Result := True;
  if (FileExists( aTamUygulamaYolu, True) = False) then begin
      aHataKodu := ERROR_FILE_NOT_FOUND;
      Exit(False);
  end;
  S := String('"' + aTamUygulamaYolu + '" ' + aParametreler).Trim;
  
  ZeroMemory(@SI, SizeOf(SI));
  SI.cb := SizeOf(SI);
  if (aMinimumdaCalis = True) then begin
      SI.dwFlags     := STARTF_USESHOWWINDOW;
      SI.wShowWindow := SW_SHOWMINIMIZED;
  end;
  if (aKlasor = '')  then aKlasor := ExcludeTrailingPathDelimiter(ExtractFilePath(aTamUygulamaYolu));
  if (aKlasor <> '') then CalismaKlasoru := PChar(aKlasor) else CalismaKlasoru := nil;
  if (CreateProcess(nil, PChar(S), nil, nil, False, 0, nil, CalismaKlasoru, SI, PI) = FALSE) then begin
      aHataKodu := GetLastError;
      exit(False);
  end;

  CloseHandle(PI.hThread);
  if (aBostaKalanaKadarBekle    = True) then WaitForInputIdle(PI.hProcess, INFINITE);
  if (aSonlandirilanaKadarBekle = True) then
      repeat 
        Application.ProcessMessages;
      until  
        MsgWaitForMultipleObjects(1, PI.hProcess, False, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0 + 1;
  CloseHandle(PI.hProcess);
end;

end.

YouTube Delphi Tips

"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" P.Safa
WWW
Cevapla
#4
Müthiş 2 yöntem. çok teşekkürler.
// Bilgi paylaştıkça çoğalır.. 

Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Question Uygulama güvenliği - USB Dongle koruma ve diğerleri engerex 38 18.592 09-04-2021, Saat: 22:29
Son Yorum: enigma
  Ana Form içinde açılır kapanır form akuyumcu63 3 477 20-01-2021, Saat: 11:35
Son Yorum: mrmarman
  Listview içinde arada dilo 5 2.777 23-12-2020, Saat: 17:09
Son Yorum: Jakarta2
  Form içinde Generics Sınıfı Nasıl Kullanırım 3ddark 3 1.105 21-08-2020, Saat: 15:12
Son Yorum: ismailkocacan
  Uygulama içi ses mcuyan 8 2.508 09-06-2020, Saat: 12:14
Son Yorum: emozgun



Konuyu Okuyanlar: 1 Ziyaretçi