Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi 7 ile ACCDB Dosyalarına Compact İşlemi [Çözüldü]
#1
Merhaba Arkadaşlar;

Ben delphi 7 ile uygulama geliştiriyorum. Geliştirdiğim uygulamanın veritabanına da Microsoft ACE ile bağlanıyorum. Veritabanı dosyamın uzantısı accdb 'dir.

Ben bu dosyaya kendi uygulmamın içerisinden "compact" işlemi yapmak istiyorum; ancak nasıl yapılacağına dair en ufak bir fikrim bile yok. JET ile mdb uzantılı dosyalara yapılan örnekleri inceledim, ancak bunların Access 2007 ve sonrasında oluşturulan veritabanı dosyaları üzerinde işlem yapma yetkileri yok provider bölümündeki ifadeleri değiştirmeme rağmen herhangi bir netice alamadım.


Yeni nesil accdb uzantılı dosyaları nasıl compact (onarmak) edebilirim, bana bu konuda yardımcı olabilir misiniz lütfen ?
Cevapla
#2
Vaktim olmadığı için, sadece yol göstermesi açısından; TJetEngine şeklinde arama yaparak devam edebileceğinizi söyleyebilirim. Bu sınıfın CompactDatabase fonksiyonu var. Ben bu şekilde yapıyorum
There's no place like 127.0.0.1
WWW
Cevapla
#3
(12-12-2018, Saat: 18:28)SimaWB Adlı Kullanıcıdan Alıntı: Vaktim olmadığı için, sadece yol göstermesi açısından; TJetEngine şeklinde arama yaparak devam edebileceğinizi söyleyebilirim. Bu sınıfın CompactDatabase fonksiyonu var. Ben bu şekilde yapıyorum

İlgilendiğiniz için teşekkür ederim; ancak bu sınıfı denedim ve başaramadım. Sadece JET ile bağlanılmış eski mdb uzantılı dosyalarda işe yarıyor.

Tam olarak kod şöyleydi:



kaynak := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\senay\Desktop\xxx\veritabani.accdb; Persist Security Info=False';
hedef := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=temp.accdb;Persist Security Info=False';

JetEngine1.CompactDatabase(kaynak,hedef);
Cevapla
#4
https://support.esri.com/en/technical-article/000009382

bu linkte konudan bahsedilmiş. Yazdığına göre office sürümüne göre access dabase engine yüklenmeliymiş.
eğer 64 bit  office 2010 varsa 2007 Access Database Engine (link), diğer türlü(32 bit) 2010 Access Database Engine (link) yüklenmeliymiş

Yükleme işleminden sonra hem mdb hem de accdb için provider çıkacak diyor.

eğer yukardaki linkte anlamadığın bişey olursa -inşaallah- yardımcı olurum.
Cevapla
#5
forumcuali, makalede yazan her şeyi yaptım. Tablolarla bağlantı kurma, SELECT, POST, DELETE ve UPDATE işlemlerini yapma gibi bir sıkıntım yok. Yukarıda da ifade ettiğim gibi accdb uzantılı (Access 2007 ve sonrası) veritabanı dosyalarını eski yöntemlerle uygulama içinden Compact edip, onarmak istediğimde problemle karşılaşıyorum.

JetEngine sınıfı işime yaramıyor ya da bunu sınıfı kullanarak accdb uzantılı dosyalarla işlem yapma biçimi daha değişiktir bunu da ben bilmiyor olabilirim. Bu konuda yeterli kaynağa da ulaşabilmiş değilim.
Cevapla
#6
İyi günler. Bahsettiğiniz özellik Access bileşenlerine ait bir özelliktir. Haliyle minimum Access 2007 yüklü olması gerekmektedir. Eğer sisteminizde Access yüklü ise bu bileşeni delphiden tanımlayıp, oluşturup kullanabilirsiniz. Öncelikle delphi menüsünden Component->Import Component..->Import a Type Library seçeneğinden sonra gelen listeden ACEDAO.DLL dosyasını seçerek ileri deyin ve en sonunda Create Unit i seçin. Artık Access sınıflarına delphiden erişebilirsiniz. Bendeki (v16.0) versiyona göre oluşan DAO_TLB.pas dosyasında CoDBEngine sınıfı oluştu ve aşağıdaki şekilde kullanarak istediğiniz işlemi yapabiliyorum.
procedure TForm1.Button1Click(Sender: TObject);
var DBEngine:_DBEngine;
begin
 Button1.Hide;
 DBEngine:=CoDBEngine.Create;
 DBEngine.CompactDatabase('D:\Belgeler\Database1.accdb','D:\Belgeler\Database1_New.accdb',EmptyParam,EmptyParam,EmptyParam);
 Button1.Show;
end;
Yalnız burada aynı dosya üzerine yazılamadığı için bunu sizin ayarlamanız gerekmektedir sanırım. İyi çalışmalar.
Cevapla
#7
(12-12-2018, Saat: 17:09)SenayAkgun Adlı Kullanıcıdan Alıntı: Merhaba Arkadaşlar;

Ben delphi 7 ile uygulama geliştiriyorum. Geliştirdiğim uygulamanın veritabanına da Microsoft ACE ile bağlanıyorum. Veritabanı dosyamın uzantısı accdb 'dir.

Ben bu dosyaya kendi uygulmamın içerisinden "compact" işlemi yapmak istiyorum; ancak nasıl yapılacağına dair en ufak bir fikrim bile yok. JET ile mdb uzantılı dosyalara yapılan örnekleri inceledim, ancak bunların Access 2007 ve sonrasında oluşturulan veritabanı dosyaları üzerinde işlem yapma yetkileri yok provider bölümündeki ifadeleri değiştirmeme rağmen herhangi bir netice alamadım.


Yeni nesil accdb uzantılı dosyaları nasıl compact (onarmak) edebilirim, bana bu konuda yardımcı olabilir misiniz lütfen ?



function CompactDatabase(ADatabasePathName : String) : Boolean;
var
  JE      : TJetEngine;
  sdbTemp : String;
  DAO     : OleVariant;
begin
  JE := nil;
  try
    JE := TJetEngine.Create(Application);
    result := FALSE;
    sdbTemp := IncludeTrailingBackslash(ExtractFilePath(ADatabasePathName)) + IntToStr(GetTickCount) + ExtractFileName(ADatabasePathName);
    If FileExists(sdbTemp) Then
      DeleteFile(sdbTemp);

    try
      DAO := CreateOleObject('DAO.DBEngine.120');
      DAO.CompactDatabase(ADatabasePathName, sdbTemp);
      result := TRUE;
    except
    end;

    If DeleteFile(ADatabasePathName) Then
      RenameFile(sdbTemp, ADatabasePathName);

    If FileExists(sdbTemp) Then
      DeleteFile(sdbTemp);
  finally
    If Assigned(JE) Then
      JE.FreeOnRelease;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   CompactDatabase('C:\Users\senay\Desktop\xxx\veritabani.accdb');
end;

Cevapla
#8
(12-12-2018, Saat: 21:42)Invasion Adlı Kullanıcıdan Alıntı:
function CompactDatabase(ADatabasePathName : String) : Boolean;
var
  JE      : TJetEngine;
  sdbTemp : String;
  DAO     : OleVariant;
begin
  JE := nil;
  try
    JE := TJetEngine.Create(Application);
    result := FALSE;
    sdbTemp := IncludeTrailingBackslash(ExtractFilePath(ADatabasePathName)) + IntToStr(GetTickCount) + ExtractFileName(ADatabasePathName);
    If FileExists(sdbTemp) Then
      DeleteFile(sdbTemp);

    try
      DAO := CreateOleObject('DAO.DBEngine.120');
      DAO.CompactDatabase(ADatabasePathName, sdbTemp);
      result := TRUE;
    except
    end;

    If DeleteFile(ADatabasePathName) Then
      RenameFile(sdbTemp, ADatabasePathName);

    If FileExists(sdbTemp) Then
      DeleteFile(sdbTemp);
  finally
    If Assigned(JE) Then
      JE.FreeOnRelease;
  end;
end;

Bu kodlarda JE adındaki TJetEngine nesnesini oluşturup hiç kullanmadığınızın farkında mısınız?
Soruya cevap olan kısım DAO adındaki nesneniz.
There's no place like 127.0.0.1
WWW
Cevapla
#9
sabanakman ve Invasion her ikiniz de süpersiniz ve her ikinize de çok teşekkür ederim. Az daha projemi sırf bu yüzden teslim edemeyecektim.
Cevapla
#10
@SenayAkgun Kardeşim başlığın başına [ÇÖZÜLDÜ] yazarsan bu konudan muzdarip olanlarada bi yol gösterilmiş olur. @Invasion kardeşim sanada teşekkür ediyorum bişey daha öğrendik.
@SimaWB dediği gibi jet adında oluşturduğun jetengine nesnesini hiç bi yerde kullanmamışsın orası fazladan yazılmış...
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Tek Seferde İlişkili Tüm Tablolarda Güncelleme Sorunu [ÇÖZÜLDÜ] SenayAkgun 15 377 Dün, Saat: 21:14
Son Yorum: adelphiforumz
Bug Filter property cannot be used for detail tables, Delphi 7 [ÇÖZÜLDÜ] SenayAkgun 9 248 11-02-2019, Saat: 11:56
Son Yorum: SenayAkgun
  Delphi'de Veritabanı İle Kullanıcı Giriş Ekranı Halil Han Badem 3 1.811 10-10-2017, Saat: 08:19
Son Yorum: tgural



Konuyu Okuyanlar: 1 Ziyaretçi