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
Announcement
Collapse
No announcement yet.
Print-Ausgabe vom SQL-Server in ADO sichtbar machen?
Collapse
X
-
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
-
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
-
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.


Comment
-
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
-
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
Comment