Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Backup mdb (https://www.delphipraxis.net/167489-backup-mdb.html)

blondervolker 2. Apr 2012 09:57

Backup mdb
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
bekomme bald eine Kriese.Möchte von einer Access.mdb ein Backup erstellen.
Das geht so weit alles.Aber in der einen Tabelle kommt immer die dussliche Fehlermeldung:'Auch keine' ist kein gültiger Fließkommawert
für Feld'pa_Kosten'.
Ja ich bin der Blödi,dass weiss ich...:oops:

Hab das Beispiel mit drangehangen.Die 2 Datenbanken sind auch mit enthalten.(Sourcecode)+Abb1

mkinzler 2. Apr 2012 10:06

AW: Backup mdb
 
Warum kopierst du die Felder als Strings?

Delphi-Quellcode:
tblInsert.Fields[tblInsertRecord-1].AsString:=QryFrom.Fields[tblInsertRecord-1].AsString;
Besser

Delphi-Quellcode:
tblInsert.Fields[tblInsertRecord-1].Value:=QryFrom.Fields[tblInsertRecord-1].Value;

blondervolker 2. Apr 2012 10:07

AW: Backup mdb
 
Danke.Hab das so weit abgeändert.
Jetzt kommt die nächste Meldung:ungültiger Wert für'pa_Kosten'

Aber bin doch noch am lernen:-D

Perlsau 2. Apr 2012 15:13

AW: Backup mdb
 
Zitat:

Zitat von blondervolker (Beitrag 1159783)
Möchte von einer Access.mdb ein Backup erstellen. Das geht so weit alles.

Die Formulierung "geht soweit alles" ist im Rahmen einer Aussage über Programmcode als eher schwammig zu bezeichnen.

Zitat:

Zitat von blondervolker (Beitrag 1159783)
Aber in der einen Tabelle kommt immer die dussliche Fehlermeldung:'Auch keine' ist kein gültiger Fließkommawert für Feld'pa_Kosten'.

Offenbar versucht dein Programm, den Wert "Auch keine." aus dem ersten Datensatz im Feld pa_memo dem Feld pa_Kosten zuzuweisen. Wie das genau zustannde kommt, hat sich mir auch beim Debuggen deines Codes nicht erschlossen. Mir sind jedoch ein paar Sachen aufgefallen:

1. Du versuchst, einen mittels Autowert erzeugten Wert (Feld pa_ausgangsnr) zu überschreiben.
2. Statt
Delphi-Quellcode:
for tblInsertRecord:= 1 to tblInsert.Fields.Count do
        begin
          tblInsert.Fields[tblInsertRecord-1].AsString:=QryFrom.Fields[tblInsertRecord-1].AsString;
        end;
wäre besser:
Delphi-Quellcode:
for tblInsertRecord:= 0 to tblInsert.Fields.Count -1  do
        begin
          tblInsert.Fields[tblInsertRecord].AsString:=QryFrom.Fields[tblInsertRecord].AsString;
        end;
3. Statt
Delphi-Quellcode:
for QryFromRecord:=1 to QryFrom.RecordCount do
wäre hier besser:
Delphi-Quellcode:
WHILE NOT QryFrom.EOF DO
weil du ja sowieso mit QryFrom.Next zum nächsten Datensatz weiterschaltest. Ist der letzte Datensatz erreicht, wird die Schleife noch einmal ausgeführt. Beim nächsten NEXT erreicht der Datensatzzeiger das EOF und die WHILE-Bedingung wird TRUE.

Übersichtlicher Code hilft beim Debuggen ungemein!

Wenn du eine Sicherheitskopie der gesamten Access-Datei anlegen möchtest, bietet sich die Alternative an, die gesamte Datei einfach unter einem anderen Namen zu kopieren. Ich mache das bei etlichen meiner frühen Kundendatenbanken und biete sogar dem Anwender die Möglichkeit, beim Beginn bzw. beim Beenden der Anwendung eine Sicherung anzulegen. Auch zwischendurch soll der Anwender die Möglichkeit haben, schnell mal ein Backup erzeugen zu können.

Nicht vergessen, vor dem Kopieren alle Connections zu schließen und danach wieder zu öffnen.

Bummi 2. Apr 2012 22:52

AW: Backup mdb
 
ich schließe mich Perlsau an, bei der Gelegenheit böte sich ein Kompress/Repair mit an
Delphi-Quellcode:
procedure CompressRepairMDB(DBFile : TFileName; APassword : String);
const
  tmpDBName = 'compress.mdb';
var
  JROJetEngine : TJetEngine;
  srcConn,
  destConn : String;
begin
  JROJetEngine := TJetEngine.Create(nil);
  try
    srcConn := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBFile;
    destConn := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + sPath + tmpDBName;

    if APassWord <> '' then begin
      srcConn := srcConn + ';Jet OLEDB:Database Password="' + APassWord+ '"';
      destConn := destConn + ';Jet OLEDB:Database Password="' + APassWord+ '"';
    end;

    // Datenbank reparieren & komprimieren
    JROJetEngine.CompactDatabase(srcConn, destConn);

    if FileExists(sPath + tmpDBName) then
      begin
      // Ausgangsdatenbank löschen oder auch nicht (gegf. umbenennen)
      DeleteFile(PChar(DBFile));
      // Komprimierte DB anstelle der AusgangsDB kopieren
      CopyFile(PChar(sPath + tmpDBName), PChar(DBFile), false);
      // Komprimierte DB löschen oder als Backup aufbewaren
      DeleteFile(PChar(sPath + tmpDBName));
    end;
  finally
    JROJetEngine.Disconnect;
    JROJetEngine.Free;
  end;
end;
mit Typbibliothek Microsoft Jet and Replication Objects 2.x

blondervolker 3. Apr 2012 12:11

AW: Backup mdb
 
Erstmal Dankeschön!!!

Hab es einfacher gelöst.

Delphi-Quellcode:
procedure TfrmMain.Button1Click(Sender: TObject);
var
  fileSource, fileDest: string;
begin
  fileSource := 'postbuch.mdb';
  fileDest := 'Backup\backup_postbuch.mdb';
  CopyFile(PChar(fileSource), PChar(fileDest), False);
end;

//Geht perfekt Volker
Und es erfüllt den selben Zweck:-D

Perlsau 3. Apr 2012 12:20

AW: Backup mdb
 
Zitat:

Zitat von blondervolker (Beitrag 1159935)
Erstmal Dankeschön!!! Hab es einfacher gelöst.
Delphi-Quellcode:
CopyFile(PChar(fileSource), PChar(fileDest), False);
Und es erfüllt den selben Zweck:-D

Eben. Bevor du dich in unnötigen Komplexitäten verstrickst und am Ende noch Datenverluste hinnehmen mußt :-D

Was an deiner Procedure noch fehlt, sind Disconnect vor dem Kopieren und anschließender Connect. Oder ist deine Anwendung nicht ständig mit deiner Access-Datenbank verbunden?

mkinzler 3. Apr 2012 12:24

AW: Backup mdb
 
Nur das du etwaige Fehler einfach mitkopierst.

blondervolker 3. Apr 2012 13:48

AW: Backup mdb
 
Nee,ich habe mehre Formen.Beim schließen des Programm's wird
noch eine angezeigt und dort habe ich alles reingepackt(DB schließen usw.).

Perlsau 3. Apr 2012 14:00

AW: Backup mdb
 
Zitat:

Zitat von blondervolker (Beitrag 1159956)
Nee,ich habe mehre Formen.Beim schließen des Programm's wird
noch eine angezeigt und dort habe ich alles reingepackt(DB schließen usw.).

Sicher. Aber in deiner Procedure, die du oben anzeigst, löst du doch mit einem Button den Kopiervorgang aus. Dort ist aber nichts zu erkennen, was auf einen Disconnect vor dem Kopieren hinweist. Wenn du eine verbundene Datenbank zu kopieren versuchst, kann es zu unerwarteten Problemen kommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz