Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze schnell einfügen bzw. ersetzen (https://www.delphipraxis.net/180241-datensaetze-schnell-einfuegen-bzw-ersetzen.html)

messie 4. Mai 2014 19:18

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von Perlsau (Beitrag 1257909)
Den Primary-Key setzt man gewöhnlich auf AutoInc und erzeugt den entsprechenden Key-Generator sowie die dazugehörige Stored Procedure nebst Trigger. Dann muß man ihn beim Insert nicht mitgeben. Im TIBCQuery stellt man dann das Property KeyFields auf den Primary Key und KeyGenerator auf den erzeugten Generator, damit der beim Insert aufgerufen wird und einen neuen Primary Key erzeugt und einträgt. Wenn du deine Tabelle mit IbExpert erzeugst, kannst du AutoInc, Generator, Procedure und Trigger automatisch erzeugen lassen.

Zeig doch mal deine Tabellenstruktur ...

Moin,

meine Tabellenstruktur besteht im Wesentlichen aus 5 hierarchischen Tabellen die alle mit Trigger und Generatoren ausgestattet sind. Jede untergeordnete Tabelle trägt den Index der übergeordneten als Spalte.
Die Messdaten als unterste Hierarchie können verschiedene Messpunkte enthalten, daher habe ich bisher zu Fuß per Query geprüft, ob es zu den Abfragen schon einen Index gibt. Das ist sicher aber langsam.

Nachdem ich beim Lesen ein paar Sachen kapiert habe (vielfach-Join) würde ich gerne auch beim Schreiben Befehle zusammen fassen.

Was bedeutet Query.PrimaryKey und Query.KeyGenerator in diesem Zusammenhang?

Grüße, Messie

DeddyH 4. Mai 2014 19:30

AW: Datensätze schnell einfügen bzw. ersetzen
 
Leute, lest doch einfach die verlinkte Doku, insbesondere zur "MATCHING"-Klausel. Dort gibt man die Felder an, die als eindeutig anzusehen sind. Hat man einen Unique Key definiert, müssen mindestens dessen Felder hier angegeben werden.

Perlsau 4. Mai 2014 20:04

AW: Datensätze schnell einfügen bzw. ersetzen
 
In Query.PrimaryKey wählst du den Spaltennamen des Primary-Keys deiner Tabelle, damit die Komponente beim Insert weiß, wo sie hochzählen lassen muß. In KeyGenerator wählst du den entsprechenden Generator, damit deine Komponente weiß, wo sie den neuen Wert herbekommt.

Wäre es zuviel verlangt, einfach mal den Code deiner Tabellenstruktur hier zu posten? Sonst kann ich nicht erkennen, ob du nicht schon beim Erstellen der Tabelle bereits Fehler gemacht hast. Oder ist das geheim :?::stupid:

messie 12. Mai 2014 19:55

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von Perlsau (Beitrag 1257924)
Wäre es zuviel verlangt, einfach mal den Code deiner Tabellenstruktur hier zu posten? Sonst kann ich nicht erkennen, ob du nicht schon beim Erstellen der Tabelle bereits Fehler gemacht hast. Oder ist das geheim :?::stupid:

Ja, das ist geheim :oops: und nein, ich habe keine Fehler gemacht :stupid:

Ich habe nun den von mir bevorzugten Ansatz mal getestet und bekomme meine Änderungen tatsächlich zusätzlich als Eintrag in die entsprechende DB. Ein ganzer Haufen redundanter IDs :shock:
Aber es war sehr schnell trotz der großen Anzahl von Datensätzen :-D

Ich habe gelernt, dass ich in manchen Themen gerne mal völlig betriebsblind bin. Ich sehe bisher keine Möglichkeit, in einem Rutsch ein paar tausend Datensätze in ein paar Sekunden zu implantieren. Das ist aber eine Kernaufgabe die ich zu lösen habe.

Danke, Messie

jobo 12. Mai 2014 22:06

AW: Datensätze schnell einfügen bzw. ersetzen
 
Ein paar Gedanken dazu:

* Primärschlüssel, technische (automatisch generiert) helfen Dir nicht beim Existenzabgleich, denn die einzufügenden Daten besitzen diesen eindeutigen aber "zufälligen" Schlüssel nicht.

*"ein paar tausend Datensätze"
bekommst Du tatsächlich sehr schnell über externe Tabellen in die DB

* da empfiehlt sich ggF eine extra Importtabelle fürs Laden (alles rein, ohne Abgleich)

* im 2. Schritt dann die erwähnten Merges / Update or Insert Statements und zwar nicht Satz für Satz, sondern die komplette Zwischentabelle in einem Rutsch. Abgleich über fachliche Schlüsselfelder, ggf mehrere

messie 25. Mai 2014 08:47

AW: Datensätze schnell einfügen bzw. ersetzen
 
Moin,

ich habe jetzt eine Update or Insert-Liste erstellt wie vorgeschlagen. Ich scheitere derzeit aber an der Übergabe im Programm:
Code:
DM.Query2.SQL.Add('UPDATE OR INSERT INTO ' + MDATA + '(TIME_STAMP,PUMP_STEP_ID,MEASUREMENT_INDEX,MEASURED_VALUE,TIMESTAMP_VALUE) ' +
            'values(' + QuotedStr(TimeStamp) + ',' + QuotedStr(IntToStr(DBindex)) + ',' +
            QuotedStr(IntToStr(mid)) + ',' + QuotedStr(FormatFloatNow('#0.00000', MValues[mid])) + ',' +
            QuotedStr(ts) + ') matching (TIME_STAMP,PUMP_STEP_ID,MEASUREMENT_INDEX);' );
Wenn ich den Inhalt von SQL in eine Datei speichere und in Flamerobin einfüge klappt das ohne Probleme.
Was habe ich da übersehen?

Danke, Messie

Dejan Vu 25. Mai 2014 09:40

AW: Datensätze schnell einfügen bzw. ersetzen
 
Nimm doch erst einmal Parameter.

messie 25. Mai 2014 09:48

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1260143)
Nimm doch erst einmal Parameter.

Moin,
verstehe ich nicht :oops:
Kann ich die returning-Klausel nicht weglassen? Was macht Flamerobin da anders?
Code:
update or insert into Cows (Name, Number, Location)
  values ('Suzy Creamcheese', 3278823, 'Green Pastures')
  matching (Number)
Grüße, Messie

mkinzler 25. Mai 2014 10:17

AW: Datensätze schnell einfügen bzw. ersetzen
 
Warum verwendet ihr immer .Add wenn ihr den Inhalt ersetzen wollt? :gruebel
Verwende besser (SQL-)Parameter!
Delphi-Quellcode:
DM.Query2.SQL.Text := 'UPDATE OR INSERT INTO ' + MDATA + '(TIME_STAMP,PUMP_STEP_ID,MEASUREMENT_INDEX,MEASURED_VALUE,TIMESTAMP_VALUE) ' +
            'values(':TIME_STAMP, :PUMP_STEP_ID, :MEASUREMENT_INDEX, :MEASURED_VALUE, :TIMESTAMP_VALUE);';
...
DM.Query2.ParamByName( 'TIME_STAMP).Value := TimeStamp;
...

messie 25. Mai 2014 10:47

AW: Datensätze schnell einfügen bzw. ersetzen
 
Zitat:

Zitat von mkinzler (Beitrag 1260147)
Warum verwendet ihr immer .Add wenn ihr den Inhalt ersetzen wollt? :gruebel
Verwende besser (SQL-)Parameter!
Delphi-Quellcode:
DM.Query2.SQL.Text := 'UPDATE OR INSERT INTO ' + MDATA + '(TIME_STAMP,PUMP_STEP_ID,MEASUREMENT_INDEX,MEASURED_VALUE,TIMESTAMP_VALUE) ' +
            'values(':TIME_STAMP, :PUMP_STEP_ID, :MEASUREMENT_INDEX, :MEASURED_VALUE, :TIMESTAMP_VALUE);';
...
DM.Query2.ParamByName( 'TIME_STAMP).Value := TimeStamp;
...

Add benutze ich weil ich ein paar tausend Werte ersetzen muss und das ExecSQL aus Geschwindigkeitsgründen nicht mit jeder Übergabe haben möchte. Nach meiner Auffassung und den obigen Beispielen muss ich doch nach jeder Übergabe das ExecSQL ausführen oder wird jede Parameterübergabe in den Cache geschrieben?
Was ist denn an meinem Statement falsch, dass es mit IBDAC nicht klappt aber in Flamerobin?

Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 Uhr.
Seite 2 von 4     12 34      

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