Announcement

Collapse
No announcement yet.

Print-Ausgabe vom SQL-Server in ADO sichtbar machen?

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

  • Print-Ausgabe vom SQL-Server in ADO sichtbar machen?

    Hallo, <BR>über den Query Analyzer des SQL-Servers werden die Print-Befehl-Ausgaben sehr brav angezeigt. Kann man an diese Ausgaben auch über ADO und Delphi gelangen? Ich habe bisher keinen Weg gefunden. Für eine Anregung wäre ich sehr dankbar!<BR><BR>Olle

  • #2
    Hallo,

    angenommen, in der MS SQL Server-Datenbank wird die folgende Stored Procedure angelegt:
    <pre>
    CREATE PROCEDURE PrintTest
    AS
    BEGIN
    Print 'Das ist ein Test'
    END
    </pre>
    Wenn diese Stored Procedure aus Delphi heraus über TADOStoredProc aufgerufen wird, stehen 2 Wege zur Verfügung, um die PRINT-Ausgabe sichtbar zu machen: <br>
    a) TADOConnection.<b>InfoMessage</b> <br>
    b) TADOConnection.<b>Errors</b><br>
    Das folgende Beispiel demonstriert dies:
    <pre>
    unit Unit1;

    interface

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

    type
    TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOStoredProc1: TADOStoredProc;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure ADOConnection1InfoMessage(Connection: TADOConnection;
    const Error: Error; var EventStatus: TEventStatus);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
    iError : Integer;
    begin
    ADOStoredProc1.ExecProc;
    with ADOConnection1 do
    for iError := 0 to Errors.Count - 1 do
    Memo1.Lines.Add(Errors[iError].Description);
    Memo1.Lines.Add('Fertig');
    end;

    procedure TForm1.ADOConnection1InfoMessage(Connection: TADOConnection;
    const Error: Error; var EventStatus: TEventStatus);
    begin
    Memo1.Lines.Add('OnInfoMessage: ' + Error.Description);
    end;

    end.
    </pre>
    <pre>
    object ADOConnection1: TADOConnection
    ConnectionString =
    'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initi' +
    'al Catalog=OSTEST;Data Source=(local)'
    IsolationLevel = ilReadCommitted
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    OnInfoMessage = ADOConnection1InfoMessage
    Left = 16
    Top = 16
    end
    object ADOStoredProc1: TADOStoredProc
    Connection = ADOConnection1
    ExecuteOptions = [eoExecuteNoRecords]
    ProcedureName = 'PrintTest;1'
    Parameters = <
    item
    Name = '@RETURN_VALUE'
    DataType = ftInteger
    Direction = pdReturnValue
    Precision = 10
    Value = Null
    end>
    Left = 56
    Top = 16
    end
    </pre>
    In der Memo-Instanz sind nach dem Aufruf die folgenden Zeilen zu finden:
    <pre><i>
    OnInfoMessage: Das ist ein Test
    Das ist ein Test
    Fertig
    </i></pre>
    Wenn nur die Zeile "Fertig" sichtbar ist, sollte geprüft werden, ob <i>eoExecuteNoRecords</i> korrekt konfiguriert wurde. Notfalls kann man den Test mit <i>clUseServer</i> wiederholen und dann schrittweise umkonfigurieren

    Comment


    • #3
      Hallo Herr Kosch, <BR><BR>recht vielen Dank für ihre umfassende Hilfe. Ich hatte schon den Weg über Errors.Description versucht, allerdings hatte ich die StoredProcedure gleich über die Execute-Methode des Connection-Objekts aufgerufen, und da funktioniert die Sache nicht! Warum eigentlich?<BR>
      Was noch dazu kommt: Ich kannte nicht TADOStoredProcedure.ExecProc, weil die mir nicht in der Hilfe angeboten wird. Wenn ich im Hauptfenster TADOStoredProcedure aufrufe, und dann auf Methoden klicke, erscheint ja ein neues Fenster mit den Methodennamen. Dort finde ich die Methode allerdings nicht! TADOStoredProcedure.Open verursacht einen Fehler, da ja keine Ergebnismenge zurück geliefert wird. Aber jetzt bin ich ja, dank Ihnen, schlauer!<BR>Ist eigentlich bekannt, dass noch mehr Einträge in der Hilfe von Delphi fehlen?<BR><BR>Nochmal - vielen Dank<BR>Oll

      Comment


      • #4
        Hallo,

        angenommen, Sie haben das UpdatePack#2 für Delphi 5 (<i>d5adoupdate2.exe</i>) installiert. Zumindestens hier wird ExecProc bei der direkten Suche über die Index-Seite in der Delphi-Hilfe gefunden.

        Mit der Qualität der Online-Hilfe haben Sie Recht, allerdings wird die Seite über die direkte Suche nach dem Methodennamen gefunden. In Delphi 6 wird die Hilfe noch grausiger, dort fehlen zum Beispiel die neuen WebSnap-Komponenten völlig in der Hilfe, so dass alle Links ins Leere greifen (Hilfe ist nicht fertig geworden und wird irgendwann nachgereicht).

        ADO ist eine "eierlegende Wollmilchsau" und extrem flexibel, daher kann auch das Connection-Objekt eine Stored Procedure aufrufen. Zum Beispiel ist ab MDAC 2.6 der folgende Aufruf über die späte Bindung zulässig, bei dem so getan wird, als ob der <b>Name</b> der Stored Procedure eine Methode des Connection-Objekts ist:
        <pre>
        procedure TForm1.ButtonConnectionClick(Sender: TObject);
        var
        aConnection : _Connection;
        vCon : OleVariant;
        begin
        aConnection := CoConnection.Create;
        aConnection.Open(cCS, '', '', adOpenForwardOnly);
        try
        vCon := aConnection;
        vCon.stprAddGI(1,'Ritz','Bernd','Anger','3','99091 ','Erfurt','89');
        finally
        aConnection.Close;
        aConnection := nil;
        end;
        end;
        </pre>
        Allerdings muss man bei diesen "Abkürzungen" das Kleingedruckte im MDAC-SDK sehr sorgfältig durchlesen, dort wird beschrieben, unter welchen Umständen welche Funktionalität zur Verfügung steht. Und bei einer Stored Procedure kann man nur dann auf alles zugreifen, wenn das Command-Objekt von ADO (und somit TADOStoredProc) bemüht wird.
        &#10

        Comment


        • #5
          Hallo Herr Kosch,<BR><BR>ja, über die direkte Suche habe ich die Methode in der Hilfe gefunden!<BR>Ja, ADO hat schon was, wenn man sich gut auskennt. Zumindest bin ich jetzt wieder eine ganze Ecke schlauer geworden, Dank Ihrer Hilfe.<BR><BR>Vielen Dank<BR>Olle.<BR><BR>PS: Delphi 6 - wie sagte mal eine ganz böser Mensch - Alles wird besser, aber nichts wird gut! Schade eigentlich, denn ich bin ein riesiger Delphi-Fan!!

          Comment


          • #6
            Hallo,

            ja - ich sehe das aber immer mit einem lachenden und einen weinendem Auge. Da auch dbGo (der neue Name für ADO Express) auf dem Stand von MDAC 2.1 stehengeblieben ist, gibt es für Buch-Autoren mehr zu tun. Und da mein InterBase 6+IBX-Buch fertig ist, wird eben ein ADO-Buch mit Schwerpunkt MS SQL Server 2000 in Angriff genommen, um die schlimmsten Schlaglöcher in der Delphi-Hilfe zu flicken ;-

            Comment


            • #7
              Hallo Herr Kosch

              Wenn ich in der Stroed Procedure 2 PRINT-Anweisungen einfüge, dann erscheint in diesem Testprogramm nur die erste PRINT Anweisung. Diesen Test habe ich mit dem Beispiel auf ihrer CD von Buch "ADO und Delphi" gemacht

              Comment

              Working...
              X