[Delphi/ADO] Hoe krijg ik de SQL Return Value?

Pagina: 1
Acties:
  • 324 views sinds 30-01-2008
  • Reageer

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22-06 17:07
Betreft Delphi7 / MS SQL 2000, en ik wil via een ADOcommand graag de return-value van een Stored Procedure opvragen.
Bijv:
code:
1
2
3
4
5
6
CREATE PROCEDURE Test
@Initiaal CHAR(4),
@Pincode VARCHAR(4)
AS
RETURN 5
GO


code:
1
2
3
declare @Return int
execute @Return=Test @Initiaal='A',@Pincode='0000'
select @Return


Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
  with TADOCommand.Create(NIL) do
  begin
    Connection:=ADOConnection1;
    CommandType:=cmdStoredProc;
    CommandText:='Test';
    Parameters.CreateParameter('Initiaal',ftString,pdInput,4,'JR');
    Parameters.CreateParameter('Pincode',ftString,pdInput,4,'0000');
//    Parameters.CreateParameter('Return',ftInteger,pdreturnValue,4,0);
    Execute;
    memo1.lines.add(Parameters.ParamValues['Return']);
    Free;
  end;


En dan krijg ik als reactie:
EDatabaseError: Parameter 'Return' not found


Dan voeg ik de uitgecommentariseerde regel weer toe met als direction: pdReturnValue, dan krijg ik als reactie:
EOleException: Procedure or function Test has too many arguments specified'

PS: de SQL-profiler geeft als uitgevoerd commando: exec Test 'JR', '0000'


Op internet is er heel erg weinig te vinden over de "Returnvalue"van SQL. Heeft er hier iemand ervaring mee?


PS: deze verschrikkelijk lelijke oplossing werkt, maar wil ik liever niet gebruiken:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  with TADOCommand.Create(NIL) do
  begin
    Connection:=ADOConnection1;
    CommandType:=cmdText;
    CommandText:=            'declare @Return int;';
    CommandText:=CommandText+'execute @Return=Test @Initiaal='#39'A'#39', @Pincode='#39'0000'#39';';
    CommandText:=CommandText+'select @Return';
    with TADODataSet.Create(NIL) do
    begin
      Recordset:=Execute;
      memo1.lines.add(recordset.Fields.Item[0].Value);
      Free;
    end;
    Free;
  end;

[ Voor 40% gewijzigd door jvdmeer op 14-09-2003 20:43 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:36
Je kan natuurlijk een stored procedure rond die stored procedure maken:

code:
1
2
3
4
5
6
CREATE PROCEDURE TEST ( @var1 INT, @var2 INT, @retval INT)
AS

BEGIN
  EXEC @retval = anotherProcedure @var1, @var2
END


Dan kan je die return-waarde als een gewone parameter uitlezen. Ook een beetje een work-around natuurlijk....

https://fgheysels.github.io/


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 13:01
Je moet ExecProc gebruiken ipv Execute. De result parameters worden pas geset wanneer je ExecProc wil gebruiken en niet anders :)

Zie ook in Delphi Help
Execute the stored procedure. For stored procedures that return a cursor, use the Active property or the Open method. To execute stored procedures that do not return any results or that only return output parameters, use the ExecProc method at runtime. If you plan to execute the stored procedure more than once, you may want to call Prepare to initialize the data access layer and bind parameter values into the stored procedure. For information about preparing a query, see Preparing stored procedures.
Om de return value op te vragen in delphi kan je het volgende doen

code:
1
2
3
4
5
6
  .. je code
  With AnAdoStoredProc do
  begin
    ExecProc;
    ShowMessage( ParamByName( 'Return_Value' ).AsString );
  end;


Deze probleem heb ik namelijk ook een keer gehad :)

Verwijderd

.... lama ... had niet goed gelezen :)

[ Voor 87% gewijzigd door Verwijderd op 15-09-2003 08:51 ]


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22-06 17:07
Delphi:
1
2
3
4
5
6
7
8
9
10
  with TADOStoredProc.Create(NIL) do
  begin
    Connection:=ADOConnection1;
    ProcedureName:=Test';
    Parameters.CreateParameter('Initiaal',ftString,pdInput,4,'A');
    Parameters.CreateParameter('Pincode',ftString,pdInput,4,'0000');
    ExecProc;
    memo1.lines.add(Parameters.ParamByName( 'Return_Value' ).Value);
    Free;
  end;


Werkt helaas ook niet...
Daarbij kent TAdoStoredProcedure.parameters.Parambyname niet de methode AsString.

code:
1
exec Test 'A', '0000'

[ Voor 29% gewijzigd door jvdmeer op 15-09-2003 20:17 ]


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 13:01
jvdmeer schreef op 15 September 2003 @ 19:45:
Delphi:
1
2
3
4
5
6
7
8
9
10
  with TADOStoredProc.Create(NIL) do
  begin
    Connection:=ADOConnection1;
    ProcedureName:=Test';
    Parameters.CreateParameter('Initiaal',ftString,pdInput,4,'A');
    Parameters.CreateParameter('Pincode',ftString,pdInput,4,'0000');
    ExecProc;
    memo1.lines.add(Parameters.ParamByName( 'Return_Value' ).Value);
    Free;
  end;


Werkt helaas ook niet...
Daarbij kent TAdoStoredProcedure.parameters.Parambyname niet de methode AsString.

code:
1
exec Test 'A', '0000'
OMFG het werkt pas als je de return value als eerste doet bij het toevoegen van parameters. Zie onderstaande code

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
with TAdoStoredProc.Create( nil ) do
begin
  try
      Connection := ADOConnection1;
      ProcedureName := 'Test';
      Parameters.CreateParameter('Return_Value',ftInteger,pdReturnValue,10, NULL );
      Parameters.CreateParameter('Initiaal',ftString,pdInput,4,'A');
      Parameters.CreateParameter('Pincode',ftString,pdInput,4,'0000');
      ExecProc;
      ShowMessage( VarToStr( Parameters.ParamByName( 'Return_Value' ).Value ) );
  finally
    Free;   // dit hoeft niet is wel zo netjes :)
  end
end;

[ Voor 16% gewijzigd door Just_a_Gamer op 15-09-2003 22:49 ]


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22-06 17:07
Just_a_Gamer schreef op 15 September 2003 @ 22:49:
[...]
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
with TAdoStoredProc.Create( nil ) do
begin
  try
      Connection := ADOConnection1;
      ProcedureName := 'Test';
      Parameters.CreateParameter('Return_Value',ftInteger,pdReturnValue,10, NULL );
      Parameters.CreateParameter('Initiaal',ftString,pdInput,4,'A');
      Parameters.CreateParameter('Pincode',ftString,pdInput,4,'0000');
      ExecProc;
      ShowMessage( VarToStr( Parameters.ParamByName( 'Return_Value' ).Value ) );
  finally
    Free;   // dit hoeft niet is wel zo netjes :)
  end
end;
Dit laatste werkt gelukkig, gelijk al die lelijke constructies weggehaald uit de code.

PS: de try-finally staat altijd wel in m'n definitieve code. Maar als ik hier iets quote, gebruik ik alleen de relevante code.
Pagina: 1