Entwickler-Ecke

Datenbanken - ADO, MSSQL, Stored Procedure ohne result set


JSchirrmacher - Sa 06.11.10 12:29
Titel: ADO, MSSQL, Stored Procedure ohne result set
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:


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


Mit SQL abgefragt


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:


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 - Sa 06.11.10 12:44


Delphi-Quelltext
1:
2:
3:
  p.Parameters.ParamByName('@Value1').Value := 1;
  p.ExecProc;
  Showmessage(IntToStr(p.Parameters.ParamByName('@Value2').Value))


JSchirrmacher - So 07.11.10 11:08

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:

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.