Announcement

Collapse
No announcement yet.

ADO und Transactions

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

  • ADO und Transactions

    Hallo,

    ich möchte eine Applikation die mit der BDE läuft nach ADO portieren. Bei der Applikation mit der BDE verwende ich innerhalb einer Transaktion eine Query mehrmals. Im Falle der BDE läuft dies auch ohne Probleme, d.h. alle Statements innerhalb der Transaktion werden nacheinander ausgeführt. Nach der Umwandlung nach ADO wird lediglich das letzte Statement ausgeführt.
    Was ist der Unterschied zw. einer TADOQuery und der normalen TQuery in diesem Fall? Muss ich ansonsten das TADODataset verwenden?

  • #2
    Hallo,

    welche Datenbank und welcher OLE DB-Provider wird verwendet? Was ist mit "verwende ... eine Query mehrmals" gemeint? Wird die Query mehrfach mit neuen Parametern ausgeführt oder wird der SQL-Text geändert? Wenn letzteres der Fall ist, muss man unbedingt beachten, dass sich hinter den ADO Express- (alias dbGo-) Komponenten nur eine VCL-Umverpackung für die nativen COM-Objekt von ADO verbirgt. Somit gelten die ADO-Spielregeln des <i>Command</i>-Objekts.

    &gt;Muss ich ansonsten das TADODataset verwenden?

    Nein - in der Minimalversion reicht <b>TADOConnection</b> (oder das darunterliegende native <b>Connection</b>-Objekt von ADO) aus, indem dort die SQL-Anweisung über die Methode <b>Execute</b> abgeschickt wird:
    <pre>
    <b>resourcestring</b>
    cConnStr = <font color="#9933CC">'Provider=SQLOLEDB.1;Persist Security Info=False;'</font> +
    <font color="#9933CC">'User ID=sa;Initial Catalog=OSSISOFT;Data Source=(local)'</font>;
    cSQLStr = <font color="#9933CC">'INSERT INTO AutoIncTest (Info, Datum) VALUES ('</font><font color="#9933CC">'%s'</font><font color="#9933CC">','</font><font color="#9933CC">'%s'</font><font color="#9933CC">')'</font>;

    <b>procedure</b> TForm1.ButtonInsertClick(Sender: TObject);
    <b>var</b>
    aConnection : _Connection;
    sSQL : WideString;
    vRecordsAffected : OleVariant;
    <b>begin</b>
    LogMsg(<font color="#9933CC">'Connection aufbauen ...'</font>);
    <font color="#003399"><i>// 1. Connect</i></font>
    aConnection := CoConnection.Create;
    LogMsg(<font color="#9933CC">'CoConnection.Create'</font>);
    aConnection.CursorLocation := adUseClient;
    aConnection.Open(cConnStr, <font color="#9933CC">''</font>, <font color="#9933CC">''</font>, 0);
    LogMsg(<font color="#9933CC">'CoConnection.Open'</font>);
    <font color="#003399"><i>// 2. BeginTrans</i></font>
    FTransLevel := aConnection.BeginTrans;
    LogMsg(<font color="#9933CC">'Connection.BeginTrans'</font>);
    <font color="#003399"><i>// 3. Execute INSERT</i></font>
    sSQL := Format(cSQLStr,[EditInfo.Text,EditDatum.Text]);
    aConnection.Execute(sSQL, vRecordsAffected, adExecuteNoRecords);
    LogMsg(Format(<font color="#9933CC">'CoConnection.Execute -&gt; %s Rows Affected'</font>,[vRecordsAffected]));
    <font color="#003399"><i>// 4. CommitTrans</i></font>
    aConnection.CommitTrans;
    LogMsg(<font color="#9933CC">'Connection.CommitTrans'</font>);
    <font color="#003399"><i>// 5. BeginTrans</i></font>
    FTransLevel := aConnection.BeginTrans;
    LogMsg(<font color="#9933CC">'Connection.BeginTrans'</font>);
    <font color="#003399"><i>// 6. Execute INSERT</i></font>
    sSQL := Format(cSQLStr,[Edit2Info.Text,Edit2Datum.Text]);
    aConnection.Execute(sSQL, vRecordsAffected, adExecuteNoRecords);
    LogMsg(Format(<font color="#9933CC">'CoConnection.Execute -&gt; %s Rows Affected'</font>,[vRecordsAffected]));
    <font color="#003399"><i>// 7. RollbackTrans</i></font>
    aConnection.RollbackTrans;
    LogMsg(<font color="#9933CC">'Connection.RollbackTrans'</font>);
    <font color="#003399"><i>// 8. Disconnect</i></font>
    aConnection := <b>nil</b>;
    LogMsg(<font color="#9933CC">'... Connection getrennt.'</font>);
    <b>end</b>;
    </pre&gt

    Comment


    • #3
      Hallo,

      wir verwenden einen MS SQL Server 2000 und
      den OLE DB Provider for SQL Server.
      Was ist gemeint mit "verwenden .. Query mehrmals":
      Hier ein Beispiel - Code für die Benutzung mit TQuery:

      Database1.StartTransaction;
      Query_Common.Close;
      Query_Common.SQL.Clear;
      Query_Common.SQL.Add (' Select key_int from d4_a_sir_staff where key_cor = '+Local_KEY_INT_D4_A_SIR);
      Query_Common.Open;
      If Query_common.EOF then
      Begin
      Query_Common.Close;
      Query_Common.SQL.Clear;
      Query_Common.SQL.Add (' update d4_a_sir set ');
      Query_Common.SQL.Add (' act_time = ');
      Query_Common.SQL.Add (' (select sum (act_time) from d4_a_sir_team where status < "900" and key_cor = '+Local_KEY_INT_D4_A_SIR+') ');
      Query_Common.SQL.Add (' where KEY_INT = '+Local_KEY_INT_D4_A_SIR);
      Query_Common.EXECSQL;
      End
      Else
      Begin
      Query_Common.Close;
      Query_Common.SQL.Clear;
      Query_Common.SQL.Add (' Select key_int from d4_a_sir_team where key_cor = '+Local_KEY_INT_D4_A_SIR);
      Query_Common.Open;
      If Query_common.EOF then
      Begin
      Query_Common.Close;
      Query_Common.SQL.Clear;
      Query_Common.SQL.Add (' update d4_a_sir set ');
      Query_Common.SQL.Add (' act_time = ');
      Query_Common.SQL.Add (' (select sum (act_time) from d4_a_sir_staff where status < "900" and key_cor = '+Local_KEY_INT_D4_A_SIR+') ');
      Query_Common.SQL.Add (' where KEY_INT = '+Local_KEY_INT_D4_A_SIR);
      Query_Common.EXECSQL;
      End
      else
      Begin
      Query_Common.Close;
      Query_Common.SQL.Clear;
      Query_Common.SQL.Add (' update d4_a_sir set ');
      Query_Common.SQL.Add (' act_time = ');
      Query_Common.SQL.Add (' (select sum (act_time) from d4_a_sir_staff where status < "900" and key_cor = '+Local_KEY_INT_D4_A_SIR+')+ ');
      Query_Common.SQL.Add (' (select sum (act_time) from d4_a_sir_team where status < "900" and key_cor = '+Local_KEY_INT_D4_A_SIR+') ');
      Query_Common.SQL.Add (' where KEY_INT = '+Local_KEY_INT_D4_A_SIR);
      Query_Common.EXECSQL;
      End;
      End;
      Database1.Commit

      Comment


      • #4
        Hallo,

        ich verwende den MS SQl Server 2000 und den OLE DB Provider for SQL Server für die ADOConnection. Mit "verwende ... eine Query mehrmals" ist gemeint, dass ich eine TQuery benutze um mehrere SQL Statements nacheinander mit .Open oder . ExecSql auszuführen. Und dies innerhalb von einem Starttransaction und Commit. Wie setze ich das mit ADO um bzw. kann ich dies so überhaupt mit ADO machen oder muss ich für jedes SQL Statement eine neue ADOQuery benutzen

        Comment

        Working...
        X