Announcement

Collapse
No announcement yet.

ADO SQL- Script ausführen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ADO SQL- Script ausführen

    Hallo,<br>
    wie kann ich ein SQL-Script (hunderte von Zeilen) mit den ADO-Komponenten
    ausführen.<br>
    Ich möchte die Änderungen nicht über den QueryAnalyzer, osql oder der
    gleichen durchführen, sondern dieses <br>
    SQL-Script soll ausschlieslich von meiner Delphi-Anwendung aus aufgerufen
    werden.<br>
    Leider bekomme ich Fehler da zwischen den Kommandos das &quot;GO&quot; steht.<br>
    Z.B.<br>
    &nbsp;&nbsp;&nbsp; Domänen werden angelegt<br>
    &nbsp;&nbsp;&nbsp; GO<br>
    &nbsp;&nbsp;&nbsp; Tabellen werden erzeugt<br>
    &nbsp;&nbsp;&nbsp; GO<br>
    &nbsp;&nbsp;&nbsp; StoredProcedure werden generiert<br>
    &nbsp;&nbsp;&nbsp; GO<br>
    Habe es mit ADODataset (Variation von Cursor und Locktype) und ADOcommand - ohne Erfolg ...<br>
    Was ist dabei zu beachten um einen Batch mit ADO durchführen zu können?<br>
    &nbsp;<br>
    &nbsp;Gruss und Dank<br>
    &nbsp;&nbsp;&nbsp; Dietmar

  • #2
    Hallo,

    für diese Aufgabe sind TADODataSet und TADOCommand zu "intelligent". Statt dessen ist die <b>Execute</b>-Methode des <b>Connection</b>-Objekts die richtige Wahl. Dieses native ADO-Objekt wird von <b>TADOConnection</b> gekapselt, so dass folgendes zum Ziel führt:
    <pre>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>resourcestring</b>
    cSQL = <font color="#9933CC">'CREATE TABLE Test('</font> +
    <font color="#9933CC">'recid int not null identity primary key,'</font> +
    <font color="#9933CC">'wert varchar(9) not null);'</font> +
    <font color="#9933CC">'INSERT INTO Test (wert) VALUES ('</font><font color="#9933CC">'Test1'</font><font color="#9933CC">');'</font>;
    <b>var</b>
    iRows : Integer;
    <b>begin</b>
    <b>with</b> ADOConnection1 <b>do</b>
    <b>begin</b>
    Connected := True;
    BeginTrans;
    Execute(cSQL, iRows, [eoExecuteNoRecords]);
    CommitTrans;
    Connected := False;
    <b>end</b>;
    <b>end</b>;
    </pre>
    Die <b>GO</B>-Anweisung wird nur vom <i>Query Analyzer</i> ausgewertet. In einer über ADO ausgeführten SQL-Stapelanweisung ist diese Zeile als Trenner nicht notwendig, statt dessen verwende ich das Semikolon als visuellen Anweisungsbegrenzer.

    Comment


    • #3
      Hallo,
      <p>vielen Dank für obige Antwort.<br>
      Naja, dass das &quot;TADODataSet und TADOCommand zu &quot;intelligent&quot; sind,
      kann man unterschiedlich auslegen :-).<br>
      Dennoch habe ich auch noch die native ADO-Variante &quot;CoCommand&quot;-etc.
      ausprobiert und stellte bei allen <br>
      Varianten fest, dass der &quot;<b>;</b>&quot;-Strichpunkt störte.<br>
      &nbsp;<br>
      Nun <br>
      &nbsp;&nbsp;&nbsp; starte ich eine Transaktion <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lese das Script ein, <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; schaue nach
      ob in einer Zeile das <b>GO</b> steht <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp; wenn ja <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      führe Execute aus<br>
      &nbsp;&nbsp;&nbsp; wenn kein Fehler Commit<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ansonsten Rollback<br>
      Das ist für mich ein gute und einfache Lösung.<br>
      &nbsp;&nbsp;&nbsp; <br>
      &gt;Die <b>GO</b>-Anweisung wird nur vom <i>Query Analyzer</i> ausgewertet. <br>
      Ich stellte fest, dass der <b><i>Profiler</i></b> das <b>GO</b> gar nicht mehr
      anzeigt.<br>
      Es sieht aber danach aus, dass das <b>GO</b> vielleicht ein pseudo Commit ist <br>
      und löst dadurch eine interne verschachtelte Transaktion auf. Wer weiß ...<br>
      <p>Grüsse<br>
      &nbsp;&nbsp;&nbsp; Dietma

      Comment

      Working...
      X