Announcement

Collapse
No announcement yet.

TADOStoredProc (Anzahl veränderter Datensätze)

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

  • TADOStoredProc (Anzahl veränderter Datensätze)

    Hallo

    Ich mache mittels StoredProcedure (TADOStoredProc) einen Update auf mehreren Datensätzen in einer Tabelle. Die Parameter werden zur Laufzeit gesetzt.

    Bei der Datenbank handelt es sich um MS SQL Server 7.

    Wie kann nach ExecProc festgestellt werden, wieviele Datensätze angepasst worden sind?

    Danke für ein Tipp. Daniel

  • #2
    Hallo,

    bei <b>TADOStoredProc</b> handelt es sich nur um ein Kompatibilitätsobjekt, um den Umstieg von der BDE zu erleichtern. Nur mit den direkten ADO-Komponenten stehen alle ADO-Merkmale zur Verfügung. Eine Stored Procedure kann auch über <b>TADOCommand</b> abgesetzt werden. Die auszuführende Anweisung wird der Eigenschaf <b>CommandText</b> zugewiesen. Wenn eine Stored Procedure ausgeführt werden soll, wird der Name zugewiesen. Die Methode <b>Execute</b> führt die in <b>CommandText</b> abgelegt Anweisung aus. Dabei kann geprüft werden, wie viele Datensätze der Datenmenge von dieser Anweisung betroffen waren:
    <pre>
    var
    iRecsChanged: Integer;
    begin
    with ADOCommand1 do
    begin
    CommandType := cmdText;
    CommandText := 'UPDATE Project_Dtl ' +
    'Set QTY_BILLED = (QTY_BILLED + :QTY_BILLED) ' +
    'WHERE (PROJECT_NO = :PROJECT_NO) AND ' +
    '(DRAWING_NO = RAWING_NO) ' +
    'AND (DESCRIP = ESCRIP)';
    Execute(iRecsChanged, VarArrayOf([Qty, ProjectNo, DrawingNo, Descrip]));
    end;
    if iRecsChanged <> 1 then
    ShowMessage('Update des Datenbanktabelle ist fehlgeschlagen!');
    end;
    </pre>

    P.S: Es gibt einen Ordner ADO in diesem Forum, alle ADO-Fragen sollten dort zusammengefasst werden

    Comment


    • #3
      Hallo Andreas

      Vielen Dank für den Tipp. Der Update wird korrekt durchgeführt. In der Variable iRecsChanged steht aber leider 0, obwohl der Datensatz angepasst worden ist. Siehe Programmbeispiel.

      with DBCmdMandant do
      begin
      CommandType := cmdStoredProc;
      Connection := DBConMandant;
      Parameters.Clear;
      CommandText := 'ap_upd_mwst_2';
      Parameters.Refresh;
      Parameters.ParamValues['@MwstNr'] := StrToInt(ndfMwstNr.Text);
      Parameters.ParamValues['@SortFeld']:= StrToInt(ndfSortfeld.Text);
      Execute(iRecsChanged);
      showmessage('Mutierte Datensätze = ' + IntToStr(iRecsChanged));
      end;

      Wie kann das sein ?

      Danke Danie

      Comment


      • #4
        Hallo,

        wie sieht die Konfiguration aller ADO-Komponenten aus (Text-Darstellung des Formular/Datenmodul-Inhalts)

        Comment


        • #5
          Hallo,

          Versuch a)<br>

          1. Parameters setzen<br>
          Parameters.ParamValues['@FeldName']:= Wert;<br>
          2. Ausführen<br>
          Execute( iRecsChanged )<br>

          Resultat:<br>
          iRecsChanged ist immer 0, obwohl Update durchgeführt wurde<br>

          Versuch b)<br>

          1. Ausführen<br>
          Execute(iRecsChanged, VarArrayOf([Wert1,Wert2...])<br>

          Resultat:<br>
          iRecsChanged wird richtig gesetzt, aber nach der <br>
          ersten Ausführung werden die Daten nur noch<br>
          in der Feldlänge des ersten Updates abgespeichert.<br>
          (muss der Array initialisiert werden?) <br>

          Vielen Dank für Deine Unterstützung.<br>

          Gruss Daniel<br>

          Hier die noch die Text-Darstellung der beteiligten<br>
          ADO-Komponenten:<br>

          <b>Connection<\b><p>

          object DBConMandant: TADOConnection<br>
          ConnectionString =
          'FILE NAME=C:\Programme\Gemeinsame Dateien\System\OLE DB\DataLinks\DBConMandant.UDL'<br>
          LoginPrompt = False<br>
          Provider =
          'C:\Programme\Gemeinsame Dateien\System\OLE DB\Data Links\DBConMandant.UDL'<br>
          Left = 12<br>
          Top = 48<br>
          end<p>

          <b>Command<\b><p>

          object DBCmdMandant: TADOCommand<br>
          CommandText = 'ap_upd_Mwst_2;1'<br>
          CommandType = cmdStoredProc<br>
          Connection = DBConMandant<br>
          Parameters = <<br>
          item<p>
          Name = 'RETURN_VALUE'<br>
          DataType = ftInteger<br>
          Direction = pdReturnValue<br>
          Precision = 10<br>
          Value = Null<br>
          end<br>
          item<p>
          Name = '@MwstNr'<br>
          Attributes = [paNullable]<br>
          DataType = ftBCD<br>
          Precision = 10<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@SortFeld'<br>
          Attributes = [paNullable]<br>
          DataType = ftBCD<br>
          Precision = 10<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@KurzBez'<br>
          Attributes = [paNullable]<br>
          DataType = ftString<br>
          Size = 10<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@Text'<br>
          Attributes = [paNullable]<br>
          DataType = ftString<br>
          Size = 40<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@Satz'<br>
          Attributes = [paNullable]<br>
          DataType = ftBCD<br>
          NumericScale = 2<br>
          Precision = 4<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@InklExklSCNr'<br>
          Attributes = [paNullable]<br>
          DataType = ftBCD<br>
          Precision = 10<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@Konto'<br>
          Attributes = [paNullable]<br>
          DataType = ftString<br>
          Size = 20<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@Kst'<br>
          Attributes = [paNullable]<br>
          DataType = ftString<br>
          Size = 20<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@Lv'<br>
          Attributes = [paNullable]<br>
          DataType = ftBoolean<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@BuchMwstCode'<br>
          Attributes = [paNullable]<br>
          DataType = ftString<br>
          Size = 20<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@GueltigVon'<br>
          Attributes = [paNullable]<br>
          DataType = ftDateTime<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@ZeitStempel'<br>
          Attributes = [paNullable]<br>
          DataType = ftVarBytes<br>
          Size = 8<br>
          Value = Null<br>
          end<br>
          item<br>
          Name = '@Sprache'<br>
          Attributes = [paNullable]<br>
          DataType = ftSmallint<br>
          Precision = 5<br>
          Value = Null<br>
          end<p>
          Left = 308<br>
          Top = 33<br>
          end<br&gt

          Comment


          • #6
            Hallo,

            wenn der Versuch b) erfolgreich ist, bedeutet dies nur, das Execute immer mit den beiden Parameter aufgerufen werden muss. Allerdings darf man als 2. Parameter auch den Joker <b>EmptyParam</b> setzen, wie das folgende Beispiel zeigt:
            <pre>
            procedure TForm1.Button1Click(Sender: TObject);
            var
            iRowsAffected : Integer;
            begin
            ADOCommand1.Execute(iRowsAffected, EmptyParam);
            ShowMessage(Format('%d Datensätze geändert',[iRowsAffected]));
            end;
            </pre>
            Auch dann erhalte ich den korrekten Wert in <i>iRowsAffected</i>. Die ausgeführte SQL-Anweisung sieht so aus:
            <pre>
            object ADOCommand1: TADOCommand
            CommandText = 'UPDATE dbo.AutoIncTest'#13#10' SET Info = '#39'Neu'#39#13#10' WHERE ID > 2'
            Connection = ADOConnection1
            Parameters = <>
            Left = 64
            Top = 24
            end
            </pre>
            Da kein Parameter verwendet wird, muss ich auch keinen übergeben

            Comment

            Working...
            X