Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Teildatenbank aus großer Datenbank erzeugen (https://www.delphipraxis.net/144402-teildatenbank-aus-grosser-datenbank-erzeugen.html)

khh 8. Dez 2009 12:44

Re: Teildatenbank aus großer Datenbank erzeugen
 
Zitat:

Zitat von alzaimar




Ich glaube, er ist nicht so weit, als das er selbstkritisch Fragen nach der Qualität seiner Lösung bzw. der zugrundeliegenden Datenbank stellt. Also respektieren wir das und halten uns doch bitte zurück.

sorry, wenn ich zu tief in "Privatsphären" dringen wollte ;-)

Ich wollte nur die Aussage von -viel- im Zusammenhang mit einer relationalen Datenbank geklärt wissen.
Eine Unwissenheit des Fragestellers wollte ich keineswegs unterstellen, sondern lediglich ausschliessen.
Ach ja, falls der Eindruck entstand, ich sehe einen Zusammenhang zwischen Anzahl der Datensätze oder Anzahl Tabellen und Normalisierungsgrad, so möchte ich dem widersprechen, dem ist nicht so.

Damit genug blabla ;-)





Gruss KHH

alzaimar 8. Dez 2009 15:25

Re: Teildatenbank aus großer Datenbank erzeugen
 
Zitat:

Zitat von Tyrael Y.
Ich versuche mich gerade mit der Version mit SELECT INTO, da dies für mich sehr elegant erscheint.

Das könnte sein, ist aber dann nicht allgemeingültig, da diese Syntax nicht vielen RDBMS geläufig ist.
Wenn es eh nur um Access geht, und du die eleganteste aller elegantesten Lösungen willst, würde ich mal schauen, ob man mit der OLE-Schnittstelle von Access nicht weiterkommt. Eventuell musst Du nur ein spezielles Access-Objekt instantiieren, mit ein paar Daten füttern und los gehts.

Allerdings dürfte der Vorschlag von mir -gepaart mit einer Transaktionskapselung- schnell genug sein. Und vollkommen transparent gegenüber einer Migration der Datenbanken in ein anderes Format ist es außerdem.

Ich persönlich empfinde eine solche Lösung robuster als eine Variante, die sich zu sehr auf den bestehenden Status Quo (DB-Engine, SQL-Dialekt, Tabellenstruktur) verlässt.

Tyrael Y. 9. Dez 2009 07:56

Re: Teildatenbank aus großer Datenbank erzeugen
 
Hallo zuzsammen,

die Variante mit SELECT INTO hat im Praxistext fehlgeschlagen mit der Fehlermeldung "Abfrage ist zu komplex".
Bei dieser Variante dürfen die Tabellen nicht existieren. Das SELECT INTO erzeugt selbst die Tabelle und schreibt dann alle Abfrageergebnisse in diese neue Tabelle.

Das Problem ist, das die WHERE Klausel in der Praxis mehr als 40 ("...WHERE ID=1 OR ID=2 OR ID=23 OR ID=56...")
ID´s auf einmal abfragt. Dies ist mit ADO, so wie es aussieht nicht möglich.
Mehrere SELECT INTO Abfragen auf die selbe Tabelle sind nicht möglich, da nach der ersten Abfrage die Tabelle besteht und es dann eine Fehlermeldung geben würde.
Wenn ich mich mit dieser Aussahe irre, schreit mich einfach an ;)


alzaimers Variante würde im Prinzip funtionieren....
Delphi-Quellcode:
Procedure TForm1.CopyRecords (aSrcConnection, aDstConnection : TADOConnection; aTableName : String; aID : Integer);
Var
  qSource, qDest : TADOQuery;
  i : Integer;
Begin
  qSource := TADOQuery.Create(nil);
  qSource.Connection := aSrcConnection;
  qDest := TADOQuery.Create(nil);
  qDest.Connection := aDstConnection;
  try
     qSource.SQL.Text := Format ('select * from [%s] where Text_ID = :ID',[aTableName]);
     qDest.SQL.text := qSource.SQL.text;
     qSource.Parameters.ParamValues['ID'] := aID;
     qSource.Open;
     qDest.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;
Im Prinzip, da es im Praxistest fehlgeschlagen ist. Das Feld Text_ID ist ein Autowert Feld.
Es muss aber dieselbe ID letzendlich haben, wie es in der Quelldatenbank stand.
Jetzt bitte nicht "dann hast du die DB falsch konzipiert..." usw.
Die DB ist mir vorgegeben, sie ist nicht von mir, da kann ich nichts dran rütteln und muss es als Tatsache hinnehmen.
Es kommt ein Fehler der sagt, das Text_ID nicht verändert werden kann.
Klingt auch logisch, da es ein Autowert Feld ist.

Habe ich trotzdem eine Möglichkeit in ein Autowert-Feld einen Wert einzutragen?
Oder habt ihr vielleicht einen anderen Ansatz mit der ich das bewerkstelligen kann?

P.S.: Meine Ursprungsvariante von der ich dachte, dass es funktioniert, hat denselben Makel, das Autowert Feld macht mir einen Strich durch die Rechnung.

schlecki 9. Dez 2009 08:09

Re: Teildatenbank aus großer Datenbank erzeugen
 
Zitat:

Zitat von Tyrael Y.
Das Problem ist, das die WHERE Klausel in der Praxis mehr als 40 ("...WHERE ID=1 OR ID=2 OR ID=23 OR ID=56...")
ID´s auf einmal abfragt.

Wie siehts aus mit folgendem Konstrukt?

SQL-Code:
... where ID in (1, 2, 23, ...) ...

Tyrael Y. 9. Dez 2009 08:28

Re: Teildatenbank aus großer Datenbank erzeugen
 
Ich bin begeistert!
Sehr schön, mit
SQL-Code:
... where ID in (1, 2, 23, ...) ...
funktioniert es einwandfrei.
Vielen Dank dir für diesen Hinweis. :D


Zu der Variante von alzaimer in Zusammenhang mit Autowert Feldern hätte ich ein Idee.
In einer Schleife wird diese Prozedur für alle Tabellen aufgerufen.
In der ersten Zeile der Schleife, werden alle Autowert Felder auf Zahl mittels ALTER TABLE geändert.
Nach der Prozedur werden diese Felder wieder zu Autowert geändert.

Sollte doch auch prinzipiell gehen oder?


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

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-2025 by Thomas Breitkreuz