![]() |
Re: Teildatenbank aus großer Datenbank erzeugen
Zitat:
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 |
Re: Teildatenbank aus großer Datenbank erzeugen
Zitat:
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. |
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:
Im Prinzip, da es im Praxistest fehlgeschlagen ist. Das Feld Text_ID ist ein Autowert Feld.
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; 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. |
Re: Teildatenbank aus großer Datenbank erzeugen
Zitat:
SQL-Code:
... where ID in (1, 2, 23, ...) ...
|
Re: Teildatenbank aus großer Datenbank erzeugen
Ich bin begeistert!
Sehr schön, mit
SQL-Code:
funktioniert es einwandfrei.
... where ID in (1, 2, 23, ...) ...
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. |
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