AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datenimport: DS einfügen oder ersetzen, wie am geschickteste
Thema durchsuchen
Ansicht
Themen-Optionen

Datenimport: DS einfügen oder ersetzen, wie am geschickteste

Ein Thema von guidok · begonnen am 12. Mär 2008 · letzter Beitrag vom 12. Mär 2008
Antwort Antwort
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#1

Datenimport: DS einfügen oder ersetzen, wie am geschickteste

  Alt 12. Mär 2008, 06:54
Datenbank: MSSQL • Version: Express • Zugriff über: ADO
Hallo!

Ich muss Daten aus einer Textdatei in eine DB importieren, was auch grundsätzlich funktioniert. Aber: Dieser Import wird nicht nur einmalig stattfinden, sondern vermutlich in regelmäßigen Abständen (es handelt sich um Daten, die aus SAP kommen und sich ändern können), d.h. Datensätze können neu dazu kommen, oder bereits vorhanden sein. Ich muss demnach entweder ein INSERT machen oder ein UPDATE. Jetzt kann ich mit einem SELECT prüfen, ob der DS bereits existiert und danach entsprechend verfahren, aber das kommt mir nicht sehr elegant vor. Wie kann ich das am besten bewerkstelligen, ggf. in einem Query-Aufruf?

Guido
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt

  Alt 12. Mär 2008, 06:58
Zitat von guidok:
... Jetzt kann ich mit einem SELECT prüfen, ob der DS bereits existiert und danach entsprechend verfahren, aber das kommt mir nicht sehr elegant vor. ...
Hai Guido,

Du wirst um diesen Weg nicht herumkommen. Um das ganze nicht auf dem Client zu machen würde ich eine SP vorschlagen. Dann läuft das SELECT "nur" auf dem Server und es werden keine unnötigen Daten übertragen.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#3

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt

  Alt 12. Mär 2008, 06:59
Wie wäre es einfach das ChangeDatum als Feld in die Tabelle schreiben- Dann musst du nur noch wissen wann der letze Import/export gemacht wurde, und kannst einfach mit select alles neuere auslesen. So würde ich es machen.

Thorben
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt

  Alt 12. Mär 2008, 07:03
mit Merge
Markus Kinzler
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#5

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt

  Alt 12. Mär 2008, 07:19
Zitat von mkinzler:
mit Merge
Zitat:
introduced in upcoming SQL Server 2008
Wenn ich das so lese, dann hab ich das noch gar nicht, oder?

@Thorben_Ko: Entweder ich verstehe das nicht ganz, oder es löst mein Problem nicht. Ich muss ja trotzdem vorher prüfen, ob der Datensatz eingefügt oder geändert werden soll.

@Sharky: Ich kenn mich ja sowas von gar nicht mit SP aus. Gibt es da ein gescheites Tutorial dazu?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt

  Alt 12. Mär 2008, 07:37
Zitat:
Wenn ich das so lese, dann hab ich das noch gar nicht, oder?
Das musst du wissen, welche Version du hast.
Markus Kinzler
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#7

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt

  Alt 12. Mär 2008, 07:53
@mkinzler: Ich gebe zu, dass ich der Meinung war mit SQL Server 2005 Express die neueste Version zu haben. Gut, da habe ich mich geirrt, allerdings werde ich das zunächst auch mal nicht ändern (wollen).

Wird so etwas in der Art funktionieren?

IF NOT EXISTS (SELECT TP FROM TEPL WHERE TP = :pTP) THEN
INSERT INTO TEPL... usw.
ELSE
UPDATE... usw.
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#8

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt

  Alt 12. Mär 2008, 10:29
Ich habe es jetzt hingekriegt:

Delphi-Quellcode:
    SQL.Add('IF EXISTS (SELECT TP FROM TEPL WHERE TP=:pSTP)' +
            ' BEGIN' +
            ' UPDATE TEPL SET BEZ=:pUBEZ, KST=:pUKST, ANL=:pUANL, ANR=:pUANR, STAT=:pUSTAT' +
            ' WHERE TP=:pUTP' +
            ' END' +
            ' ELSE' +
            ' INSERT INTO TEPL (TP, BEZ, KST, ANL, ANR, STAT)' +
            ' VALUES(:pITP, :pIBEZ, :pIKST, :pIANL, :pIANR, :pISTAT);');
Es funktioniert und ist auch hinreichend schnell für meine Anwendung.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Datenimport: DS einfügen oder ersetzen, wie am geschickt

  Alt 12. Mär 2008, 11:15
Ich mach das immer anderst:
(Keine Ahnung, ob das performant oder glücklich oder schön ist. Das ist mir aber egal. Es funktioniert. )
Delphi-Quellcode:
Query.SQL = 'SELECT Feld_1, Feld_2, ..., Feld_n FROM tabelle WHERE Feld_x = irgendwas';
Query.Open;

if Query.Locate('Feld_a, Feld_b, Feld_c', VarArrayOf([Wert_1, Wert_2, Wert_3]), [loCaseInsensitive]) then
begin
  Query.Insert;
  // Felder setzen, die nur bei insert gesetzt werden sollen
  Query.FieldByName('Feld_x').AsString = 'abcd';
end
else
begin
  Query.Edit;
  // Felder setzen, die nur bei update gesetzt werden sollen
  Query.FieldByName('Feld_y').AsString = 'efgh';
end;
// Felder setzen, die immer gesetzt werden sollen
Query.FieldByName('Feld_z').AsString = 'ijkl';

// in DB eintragen
Query.Post;
Query.Close;
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:17 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