Announcement

Collapse
No announcement yet.

_RecordSet verwenden

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

  • _RecordSet verwenden

    Ich habe wegen Problemen mit AdoExpress auf die Objekte _RecordSet und _Connection umgestellt.
    Früher habe ich bei TADOQuery Parameter benutzt jetzt setzte ich das komplette SQL Statement als String und öffne den RecordSet.

    Es gibt Statements bei denen der SQL Server 2000 mir immer ein Time Out schickt. Diese haben aber vorher wunderbar funktioniert.
    Führe ich die gleichen Statements direkt im Query Analyzer aus ist es genau gleich. Dort kommt aber nach langer Zeit das Ergebnis. Das Statement an sich ist also korrekt.

    Das komische ist, dass kompliziertere Statements, die über einen Join gebildet werden und mehr Felder lesen zeitlich ungefähr gleich schnell sind wie vorher.

    Gibt es irgendeine logische Erklärung?
    Gibt es die Möglichkeit Parameter für ein SQL Statement an den SQL Server zu geben und ist dies schneller?

  • #2
    Hallo,

    > Gibt es die Möglichkeit Parameter für ein SQL Statement an den SQL Server zu geben und ist dies schneller?

    Ja. Rein technisch gesehen, stecken hinter ADO Express nur VCL-Wrapperkomponenten, die alle Basis-Funktionen direkt zu den nativen ADO-Objekten <b>Connection</b>, <b>Command</b> und <b>Recordset</b> weiterleiten. Da ADO Express nur ein Aufsatz ist (der Rechenzeit kostet), sind die Zugriffe auf die nativen ADO-Objekte in allen Fällen schneller (dies kann über Testprogramme jederzeit auch praktisch nachgewiesen werden).

    In meinem neuen ADO-Buch (das noch in diesen Monat verfügbar sein sollte) gehe ich ausführlich auf die Zugriffe auf die nativen ADO-Objekte ein. Das folgende Beispiel demonstriert den schnellsten Zugriffsweg:<br>
    - Stored Procedure in der Datenbank<br>
    - Command-Objekt ruft Stored Procedure auf und übergibt Parameter<br>
    - Ergebnis der Stored Procedure wird vom Recordset-Objekt entgegengenommen<br>
    Da ich auf die Northwind-Beispieldatenbank des MS SQL Server 2000 zugreifen, kann das Beispiel sofort ohne Vorbereitungen nachgebaut werden.
    <pre>
    { ************************************************** **************
    Autor : Andreas Kosch
    Compiler : Delphi 6.01 Enterprise
    Betriebssystem : Windows 2000 SP2 / Windows XP Professional
    Erstellt am : 06.12.2001 / 09.12.2001
    Beschreibung : Das Recordset-Objekt fordert eine Datenmenge
    im adLockBatchOptimistic-Modus ab, die aus
    einer Stored Procedure stammt, die wiederum
    über ein Command-Objekt aufgerufen wurde.
    ************************************************** ************** }

    unit OpenCommandDemoFrm;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, ComCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    ADODataSet1: TADODataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    StatusBar1: TStatusBar;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    uses ADOInt;

    procedure TForm1.Button1Click(Sender: TObject);
    resourcestring
    cCS = 'Provider=SQLOLEDB.1;Integrated Security=SSPI;' +
    'Persist Security Info=False;' +
    'Initial Catalog=Northwind;Data Source=(local)';
    var
    aCon : _Connection;
    aCmd : _Command;
    aRS : _RecordSet;
    begin
    aCon := CoConnection.Create;
    aCon.CursorLocation := adUseClient;
    aCon.Open(cCS, '', '', adConnectUnspecified);
    try
    aCmd := CoCommand.Create;
    try
    with aCmd do
    begin
    CommandType := adCmdStoredProc;
    CommandText := 'CustOrderHist';
    Parameters.Append(CreateParameter('@RETURN_VALUE', adInteger,
    adParamReturnValue, 4, EmptyParam));
    Parameters.Append(CreateParameter('@CustomerID', adChar,
    adParamInput, 5, 'ALFKI'));
    Set_ActiveConnection(aCon);
    end;
    aRS := CoRecordSet.Create;
    aRS.CursorLocation := adUseClient;
    try
    aRS.Open(aCmd, EmptyParam, adOpenStatic,
    adLockBatchOptimistic, adCmdUnspecified);
    aRS.Set_ActiveConnection(nil);
    // Test: Sind die Daten angekommen?
    ADODataSet1.Recordset := aRS;
    ADODataSet1.Active := True;
    ShowMessage('Daten wurden abgefordert.');
    ADODataSet1.Active := False;
    ADODataSet1.Recordset := nil;
    finally
    aRS.Close;
    end;
    finally
    aCmd := nil;
    end;
    finally
    aCon.Close;
    end;
    end;

    end.
    </pre&gt

    Comment


    • #3
      Danke für das Beispiel hat mir sehr geholfen.

      Ihr Buch habe ich schon geordert.
      Liegt der Schwerpunkt darin eher auf ADOExpress oder den COM Objekten

      Comment


      • #4
        Hallo,

        bei den Beispielprojekten kommt natives ADO genauso häufig vor wie ADO Express

        Comment

        Working...
        X