AccessDB reparieren

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
af99
Beiträge: 3
Registriert: Fr 27. Feb 2015, 14:29

AccessDB reparieren

Beitrag von af99 »

Hallo Zusammen,

ich bin neu hier und möchte mich kurz Vorstellen.

Mein Name ist Andreas. Ich programmiere sonst mit Delphi (im Moment in der Version XE5 Ultimate).

Wir arbeiten hier mit talend (ist ein Java Codegenerator). Dieser läuft auf einer Ubuntu Kiste. Mit talend fülle ich eine AccessDB dabei werden jedoch die Indizes nicht korrekt erstellt und diese sind nach der Befüllung korrupt. Nach einen Repair der Accessdatenbank sind diese wieder konsistent. Dieses Repair kann ich aber nicht mit talend durchführen.

Daher ist mir die Idee gekommen mit Lazarus ein Linux Programm zu schreiben das dieses Repair nachträglich macht. In Delphi unter Windows ist das auch kein Problem. Wenn ich das Programm jedoch unter Lazarus kompilieren möchte (erst einmal unter Windows) bekomme ich einen Fehler
Hier das Programm

Code: Alles auswählen

unit main;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComObj;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
function CompactAndRepair(DB: string): Boolean; {DB = Path to Access Database}
var
   v: OLEvariant;
begin
   Result := True;
   try
     v := CreateOLEObject('JRO.JetEngine');
     try
       V.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB,
                         'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB+'x;Jet OLEDB:Engine Type=5');
       DeleteFile(DB);
       RenameFile(DB+'x',DB);
     finally
       V := Unassigned;
     end;
   except
     Result := False;
   end;
end;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  CompactAndRepair('C:\Lazarus_Programme\outMMCD_2668.mdb');
end;
 
end.
 

und der Fehler (siehe Anhang)
Dieser kommt an dieser Stelle

Code: Alles auswählen

 V.CompactDatabase('Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB,
                         'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB+'x;Jet OLEDB:Engine Type=5');       

Kann einer helfen ???

Gruß
Andreas
Dateianhänge
fehler.png

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: AccessDB reparieren

Beitrag von theo »

Ich habe von der Sache überhaupt keine Ahnung, aber es könnte an dem String Typen liegen.
Probier mal mit WideString

function CompactAndRepair(DB: WideString)......

und

CompactAndRepair(UTF8Decode('C:\Lazarus_Programme\outMMCD_2668.mdb'));

Nur eine Vermutung...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: AccessDB reparieren

Beitrag von wp_xyz »

JRO ist von Microsoft. Ich würde mich wundern, wenn es das auch für Linux gibt.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: AccessDB reparieren

Beitrag von theo »

wp_xyz hat geschrieben:JRO ist von Microsoft. Ich würde mich wundern, wenn es das auch für Linux gibt.


Ja klar, das sowieso. Aber auf Windows müsste es doch laufen.

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: AccessDB reparieren

Beitrag von shokwave »

Theo ist auf der richtigen Spur. Bei mir klappt es, wenn man die Parameter als Widestringvariablen übergibt.

Code: Alles auswählen

function CompactAndRepair(DB: string): Boolean; {DB = Path to Access Database}
var
   v: OLEvariant;
   ws, ws2:widestring;
begin
   Result := True;
   try
     v := CreateOLEObject('JRO.JetEngine');
     try
       ws:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB;
       ws2:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+DB+'x;Jet OLEDB:Engine Type=5';
       V.CompactDatabase(ws, ws2);
       DeleteFile(DB);
       RenameFile(DB+'x',DB);
     finally
       V := Unassigned;
     end;
   except
     Result := False;
   end;
end;
 
mfg Ingo

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: AccessDB reparieren

Beitrag von gocher »

ein bisschen sauberer und ohne Variant geht es auch:
http://www.gocher.me/compactAccessMDB
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

af99
Beiträge: 3
Registriert: Fr 27. Feb 2015, 14:29

Re: AccessDB reparieren

Beitrag von af99 »

ok, super unter Windows geht es nun.
Hat einer eine Idee wie ich das unter Linux realisieren kann ?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: AccessDB reparieren

Beitrag von theo »

Du benutzt ja hier einfach Windows Tools, die es so unter Linux nicht gibt.
Vielleicht kannst du unter Wine was schrauben, aber willst du nicht lieber ein DB System nehmen, welches du nicht "reparieren" musst, und welches auch unter Linux vernünftig unterstützt wird?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: AccessDB reparieren

Beitrag von wp_xyz »

Hier steht wie du MDAC (dazu gehört soviel ich weiß auch JRO) für Wine installierst: http://www.ehow.com/how_8759443_install-mdac-linux.html. falls das gelingt, könntest du das Windows-Programm unter Wine laufen lassen.

af99
Beiträge: 3
Registriert: Fr 27. Feb 2015, 14:29

Re: AccessDB reparieren

Beitrag von af99 »

Hallo Theo und wp_xyz,

ja ich würde gerne eine vernümftige DB nehmen kann ich aber leider nicht da die WWS unserer Kunden (und das sind viele) dieses Format zum Import benötigen. Es ist auch ärgerlich das talend die DB nicht ohne Fehler befüllen kann...aber wie schon gesagt ich habe keine Wahl...leider.

Ich schau mir dann mal Wine an. Vielleicht geht damit was.

Danke schon mal

Antworten