TBatchMode in ADO ersetzen



  • Hi, ich habe die folgende Funktion:

    BatchMove->Source = Table;
    BatchMove->Destination = TableTarget;
    BatchMove->RecordCount = 1;
    BatchMove->Mode = batUpdate;
    BatchMove->Execute();
    

    Jetzt ist meine TDatabase-Verbindung einer TADOConnection-Verbindung gewichen. Wie führe ich diese BatchMove-Operation dann aus?

    Gruß, Heimelchen



  • Hi Heimelchen ,

    das kannst du eigentlich in ADO fast immer verschmerzen und durch ADOQery und einen entsprechenden SQL-Befehl ersetzen.

    Gruß Mümmel



  • Und wie würde das aussehen?
    Bin erst diese Woche in die Datenbank-Thematik eingestiegen und tu mich da grad noch ein bissl schwer.



  • Sollte wohl mit einem INSERT INTO-Statement zu lösen sein.

    INSERT INTO Zieltabelle (Spalten_Name_1, Spalten_Name_2 ...)
    SELECT Spalte_1, Spalte_2 ...
    FROM Quelltabelle
    // hier könnte eine optionale WHERE-Klausel stehen
    


  • Aber wenn ich das richitg verstanden habe (muss gestehen, den Code gab es schon vor mir), führen die paar Zeilen da oben ein Update der gesamten Tabelle durch, aber ändern maximal nur einen Posten.
    Also sowas in der Art:

    Table:
    - eins
    - zwei
    - drei
    - vier
    - fuenf
    
    TableTarget:
    - eins
    - zwei
    - sechs
    - vier
    - sieben
    
    Update(TableTarget by Table):
    - ein
    - zwei
    - drei
    - vier
    - sieben
    

    Liege ich da falsch? Das heißt doch eigentlich, ich müsste erst nach der ersten Änderung suchen und dann diese durchführen, oder?



  • Vielleicht ist es einfach zu warm, aber ich versteh nur Bahnhof?!?



  • Ich hab grad die Klimaanlage angeschmissen...

    Ich versuche mich anders auszudrücken. Ich habe den Code von mir so verstanden, dass ich eine Quell-Tabelle und eine Ziel-Tabelle angebe. Dann sage ich, aktualisiere die Zieltabelle mit den Werten der Quelltabelle. D.h. suche übereinstimmende Schlüssel, vergleiche die anderen Werte der zugehörigen Zeile und wenn was anders ist, kopiere die Werte der Quelltabelle an die entsprechende Position der Zieltabelle. ABER das ganze nur ein mal, also sobald du eine Zeile aktualisiert hast, hör damit auf.

    Wenn ich das jetzt mit einem INSERT ersetze, hab ich eigentlich nicht das gleiche, oder?



  • Das ist richtig. Da kommt dann die optionale WHERE-Klausel zum Einsatz. Und mit INSERT INTO können auch nur die fehlenden Datensätze eingefügt werden.
    Geänderte Datensätze müssten mit einem UPDATE-Statement aktualisiert werden.

    Und da ich keine Klimaanlage habe und meine Finger schon an der Tastatur kleben bleiben, wirf mal einen Blick in die Hilfe. 😉



  • Hi Heimelchen,

    Noch nen Tip, zum einen ein geeignetes SQL-Buch ausleihen und durcharbeiten oder ein Tutorial aus dem Netz nehmen.
    Und dann vor allem mal ein paar Euronen ausgeben und die "Quick Reference Map SQL" von Prof. Dr. Helmut Balzert kaufen. Da hst Du zwar für ca 20 Euro nur eine Plastefaltkarte von auseinandergefaltet 43x23 cm, aber es ist das kürzeste und beste was Du als ständigen Begleiter auf Deinem Tisch liegen haben kannst. Da sind alle Befehle von SQL 99 kurz beschrieben und mit Beispielen versehen. Und dann üben, üben, üben bis die Figer abfallen.

    Gruß Mümmel



  • Hallo

    Du vergißt das UPDATE ziemlich flexibel eingesetzt werden kann. Damit solltest du dein BatchMove auch nachbauen können.
    Zum Beispiel : In der Tabelle "dest" gibt es das Indexfeld "id" und das Wertefeld "field_d". Jetzt sollen aus der Tabelle "source" mit dem Indexfield "id" und dem Wertefield "field_s" die Daten anhand der Indices aktualisiert werden :

    UPDATE dest SET field_d = (SELECT field_s FROM source WHERE source.id = dest.id);
    

    bis bald
    akari



  • Siehste, an sowas hab ich gedacht 🙂

    SQL ist mir durchaus schon geläufig, aber bin halt noch kein Syntax-Freak. Sowas hät ich beispielsweise wohl nicht zusammengebaut bekommen, aber nu weiß ich, wo ich ran muss.



  • Jetzt hab ich da doch noch eine Sache:

    Gehen wir davon aus, ich habe die folgenden Tabellen:
    Tab1: Index - Col1 - Col2 - Col3
    Tab2: Index - Col1 - Col2 - Col3

    Jetzt will ich den Index 2 von Tab1 mit Index 2 von Tab2 aktualisieren. Jetzt denke ich an die folgende Syntax:

    UPDATE Tab1, Tab2 SET Tab1.Col1 = Tab2.Col1, Tab1.Col2 = Tab2.Col2 WHERE Tab1.Index = 2 AND Tab1.Index = Tab2.Index
    

    Meine Datenbank ist danach geändert, aber ich bekomme zwei Excetions, die erste ist:

    current provider does not support returning multiple recordsets from a single execution
    


  • Man darf nur eine Tabelle aktualisieren, zumindest deutet die Fehlermeldung darauf hin - und mir wäre auch nicht bekannt, dass man mehrere Tabellen gleichzeitig aktualisieren kann. Und, wenn ich es richtig sehe, willst du das auch gar nicht.

    So geht's: Guckst du hier (Das ist im übrigen der zweite Link der angezeigt wird, wenn man nach 'SQL Update' googled)



  • Ok, meine Referenz war mehr sql.org und danach müsste meine Syntax ok sein. Dein Link reitet so auf dem Join herum, aber das brauche ich gar nicht. Und dann steht da ganz unten noch was von temporärer Tabelle. Wenn ich das richtig verstehe, funktioniert das mit MS Access gar nicht, wobei darüber steht, dass doch. Ich blick durch den Artikel nicht recht durch...

    Sollte ich jetzt einfach die zweite Tabelle aus dem UPDATE löschen?



  • Ich hab das richtig verstanden: Du willst Tabelle 1 mit Werten aus Tabelle 2 aktualisieren? Wenn ja, dann wirst du um den Join nicht herumkommen.
    Der Link ist schon genau das richtige, da ist doch sogar ein Beispiel für Access (deswegen habe ich diesen Link herausgesucht):

    Update einer Tabelle mit JOIN (Ms-Access)

    UPDATE <Tabelle> [INNER | LEFT | RIGHT] JOIN <Tabelle>
    	ON <Spalte-1 = Spalte-2>
    	SET <Name einer Spalte> = <Ausdruck aus Spalten,
    		Konstanten, Funktionen>
    		[, weitere Spaltennamen = Ausdruck]
    	WHERE <Bedingung>
    


  • Ok, ich hatte gehofft, mit meinem neuen Thread diesen hier abzulösen, aber nun hier:
    Wenn ich das richtig verstanden habe, fügt JOIN zwei Tabellen in der Abfrage zu einer zusammen, also hängt die Spalten an. Meine beiden Tabellen haben aber exakt identische Spaltennamen, was passiert dann? Das ist der Grund, warum ich mit JOIN meine Probleme habe.



  • Dann musst du angebeben, welche Spalte aus welcher Tabelle du haben möchtest.

    Sollte dann ungefähr so aussehen:

    UPDATE Tab1
    	INNER JOIN Tab2 ON Tab1.Index = Tab2.Index
    SET Tab1.Col1 = Tab2.Col1, Tab1.Col2 = Tab2.Col2
    WHERE Tab1.Index = 2
    

    Ohne Gewähr, da mein Hirn, auf Grund akuter thermischer Probleme, nur noch auf 25% Leistung läuft... So, die letzte Stunde setz ich mich in den Serverraum und schaue den diversen Lämpchen beim blinken zu. 😉



  • Exception: Fehler in SQL Syntax.



  • Na ja, das ist das, was da unter Access angegeben war... Dann versuch doch mal den ANSI / MS-SQL-Server Code von der Seite.



  • Ich hab irgendwie das Gefühl, dass meine Syntax nicht so recht SQL entspricht. Folgendes ist laut Exception auch falsch:

    CREATE TABLE tab3 LIKE tab2
    

    Und das ist doch wohl definitv richtig, oder?


Anmelden zum Antworten