Autor Beitrag
JSchirrmacher
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 06.11.10 12:29 
Hi,

ich möchte mit Delphi6, ADO und MSSQLServer 2005 Express eine Stored procedure aufrufen, die einen Wert zurückliefert aber nicht als result set, sondern als ouptput parameter.

Beispiel:

ausblenden SQL-Anweisung
1:
2:
3:
4:
CREATE PROCEDURE TestProc(@Value1 INT, @Value2 INT OUTPUTAS
BEGIN
  SET @Value2 = @Value1 + 1;
END


Mit SQL abgefragt

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
DECLARE @v1 INT;
DECLARE @v2 INT;
SET @v1=100;
SET @v2=200;
EXEC TestProc @v1, @v2 OUTPUT;
SELECT @v2;


liefert mir die Abfrage das richtige Ergebnis 101

Mein Problem: Ich möchte das mit einer ADO-Komponente machen (TADOStoredProc). Ich habe die Komponente die Parameterliste ermitteln lassen und in der DFM-Datei sieht sie so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
  object ADOStoredProc1: TADOStoredProc
    Connection = ADOConnection1
    CursorType = ctStatic
    ExecuteOptions = [eoExecuteNoRecords]
    ProcedureName = 'TestProc;1'
    Parameters = <
      item
        Name = '@RETURN_VALUE'
        DataType = ftInteger
        Direction = pdReturnValue
        Precision = 10
      end
      item
        Name = '@Value1'
        Attributes = [paNullable]
        DataType = ftInteger
        Precision = 10
        Value = 100
      end
      item
        Name = '@Value2'
        Attributes = [paNullable]
        DataType = ftInteger
        Direction = pdInputOutput
        Precision = 10
      end>

Wenn ich das Teil Active := true setze, meldet es mir
"Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind unvereinbar"

Wenn ich die Stored Procedure so formuliere, dass sie mir mit SELECT @Value2 das Ergebnis liefert und ich die ADO-Komponente die Treffermenge abholen lasse gehts. Dann liefert sie sogar den Rückgabewert mit dem OUTPUT-Parameter.

Kann es sein, das TADOStoredProc nicht mit Stored Procedures ohne Ergebnismenge umgehen kann?

Wenn ja, wie kann ich das sonst machen (ohne mit RecordSet hantieren zu müssen nur wegen eines simplen wertes)?

Moderiert von user profile iconMartok: Delphi-Tags gesetzt
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Sa 06.11.10 12:44 
ausblenden Delphi-Quelltext
1:
2:
3:
  p.Parameters.ParamByName('@Value1').Value := 1;
  p.ExecProc;
  Showmessage(IntToStr(p.Parameters.ParamByName('@Value2').Value))
JSchirrmacher Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 07.11.10 11:08 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
  p.Parameters.ParamByName('@Value1').Value := 1;
  p.ExecProc;
  Showmessage(IntToStr(p.Parameters.ParamByName('@Value2').Value))


Ja besten Dank, nun gehts.
Mein Feher war Active:=true statt ExecProc.