AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Teildatenbank aus großer Datenbank erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Teildatenbank aus großer Datenbank erzeugen

Ein Thema von Tyrael Y. · begonnen am 7. Dez 2009 · letzter Beitrag vom 9. Dez 2009
Antwort Antwort
Seite 2 von 2     12   
khh

Registriert seit: 18. Apr 2008
Ort: Südbaden
1.929 Beiträge
 
FreePascal / Lazarus
 
#11

Re: Teildatenbank aus großer Datenbank erzeugen

  Alt 8. Dez 2009, 13:44
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
Karl-Heinz
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Teildatenbank aus großer Datenbank erzeugen

  Alt 8. Dez 2009, 16:25
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Teildatenbank aus großer Datenbank erzeugen

  Alt 9. Dez 2009, 08:56
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.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#14

Re: Teildatenbank aus großer Datenbank erzeugen

  Alt 9. Dez 2009, 09:09
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?

... where ID in (1, 2, 23, ...) ...
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Teildatenbank aus großer Datenbank erzeugen

  Alt 9. Dez 2009, 09:28
Ich bin begeistert!
Sehr schön, mit
... where ID in (1, 2, 23, ...) ... funktioniert es einwandfrei.
Vielen Dank dir für diesen Hinweis.


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?
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz