Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Teildatenbank aus großer Datenbank erzeugen

  Alt 7. Dez 2009, 18:19
Ich kann mir zwei Gründe vorstellen, wieso man soetwas machen will:
1. Ich möchte Alle Informationen zu einer ID in einer eigenen Datei zentral ablegen. Das könnte z.B. ein elektronisches Datenblatt sein. Zu einem Produkt sind alle Informationen gespeichert. Ich extrahiere aus der Zentraldanenbank die Informationen zu diesem Produkt und lege sie in einer Access-DB ab. Dann dazu noch einen Reportgenerator und -wupps- habe ich eine 'gebrandete' Anwendung. Gar nicht so doof.

2. Die Anwendung wird zu lahm, weil eben sehr viele Datensätze schon in der Datenbank sind. Ich extrahiere die aktuellen (oder alten) Sätze, um die DB schlank und performant zu halten. Möööp Möööp Möööp! Blödsinnsalarm!

Es gibt bestimmt noch mehr Gründe, aber die würde imho alle in die letzte Kategorie fallen.

Unabhängig davon, ob es nun sinnvoll ist, oder nicht: ADO bietet Dir die Möglichkeiten um dein Problem zu lösen, und zwar auch dann, wenn sich die Tabellenstruktur ändert oder neue Tabellen hinzukommen.

Mit einer TADOConnection bekommst du eine Liste aller Tabellen deiner Quelldatenbank.
Dann gehst Du alle Tabellen durch und kopierst alle Datensätze mit der entsprechenden ID:
Delphi-Quellcode:
Procedure CopyRecords (aSrcConnection, aDstConnection : TADOConnect; aTableName : String; aID : Integer);
Var
  qSource, qDest : TADOQuery;
  i : Integer;

Begin
  qSource := TADOQuery.Create;
  qSource.Connection := aSrcConnection;
  qDest := TADOQuery.Create;
  qDest.Connection := aDstConnection;
  Try
     qSource.SQL.Text := Format ('select * from [%s] where ID = :ID',[aTableName]);
     qDest.SQL.text := qSource.SQL.text;
     qSource.Parameters.ParamValues['ID'] := ID;
     qSource.Open;
     While not qSource.Eof do Begin
       qDest.Append;
       For i:=0 to qSource.FieldCount - 1 do
         qDest[qSource.Fields[i].FieldName] := qSource.Fields[i}.Value;
       qDest.Post;
       qSource.Next;
     End;
  Finally
     qSource.Free;
     qDest.Free;
  End;
End;
Getippt und nicht getestet. Funktioniert aber im Prinzip.

Du musst nur noch den kleinen Code schreiben, der dir alle Tabellennamen auflistet und dann für jede Tabelle o.g. Routine aufrufen. Fertig.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat