Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO Query mit Parameter (https://www.delphipraxis.net/139914-ado-query-mit-parameter.html)

Andidreas 8. Sep 2009 10:28

Datenbank: DB2 (AS400) • Zugriff über: ADO

ADO Query mit Parameter
 
aloha zusammen,

ich versuch gerade verzweifelt eine Stored Procedure auf einer AS400 aufzurufen...
da ich mit der Stored Procedure komponente von ADO nicht so vertraut bin, wollte ich es gerade über eine normale ADOQuery versuchen...

In der ADO Query habe ich mir 3 Parameter Felder angelegt (2 Input, 1 Output)

mein source sieht wie folgt aus:

Delphi-Quellcode:
  Try
    With (dmas400_main.as400_query2) Do
    Begin
      Active := False;
      SQL.Clear;
      Parameters.ParamByName('KZGR').Value   := '3';
      Parameters.ParamByName('ZUKZ').Value   := ' ';
      Parameters.ParamByName('Return').Value := EmptyStr;
      dmas400_main.as400_query2.Prepared := True;
      SQL.Add('Call LIBARY.StoredProcedure1 (:KZGR, :ZUKZ, :Return)');
      ExecSQL;
    End;
  Except
    MessageDlg('Error SQL Query!', mtError, [mbOK], 0);
    Exit;
  End;
das komische ist, das er beim 1. versuch den SQL ohne probleme ausführt, allerdings ist danach der Return Parameter leer!
Beim 2. mal ausführen findet er auf einmal den 1. Parameter nicht mehr...

hat jemand eine idee woran es liegen könnte?

Andidreas 8. Sep 2009 11:57

Re: ADO Query mit Parameter
 
ich habs jetzt alternativ mal noch mit einem adocommand probiert...

Delphi-Quellcode:
  Try

    dmas400_main.adocmd.CommandText := 'Call LIBARY.StoredProcedure1 (:KZGR, :ZUKZ, :Return)';
    dmas400_main.adocmd.Parameters.ParamByName('KZGR').Value := '3';
    dmas400_main.adocmd.Parameters.ParamByName('ZUKZ').Value := ' ';
    dmas400_main.adocmd.Parameters.ParamByName('Return').Value := EmptyStr;
    dmas400_main.adocmd.Execute;

  Except

    MessageDlg('Error Command', mtError, [mbOK], 0);

  End;
da bringt er mir zwar nicht mehr die fehlermeldung mit dem parameter den er nicht findet, aber mein return value ist immer noch leer :(
wenn jemand eine idde hat worans liegen könnte oder wie ich alternativ die stored procedure aufrufen kann und die werte zurück bekommen, dann meldet euch bitte... ich bin grad am verzweifeln ^^


edit: source eingefügt

nahpets 8. Sep 2009 12:04

Re: ADO Query mit Parameter
 
Hallo,

soweit ich weiß, kann man mit den Parametern nur Werte an die Abfrage übergeben, bekommt dort aber keine Rückgabewerte.

Aber schau Dir bitte mal dashier an: Delphi - Returning data with stored procedures

Andidreas 8. Sep 2009 12:27

Re: ADO Query mit Parameter
 
danke für den link...

ich habs mal so nachprogrammiert wie beschrieben...
jetzt kennt er auf einmal meine parameter nicht mehr :(

habs mit adocommand und adostoredprocedure versucht:

storedprocedure
Delphi-Quellcode:
  dmas400_main.StoredProcedure.ProcedureName := 'LIBARY.STOREDPROCEDURE1';
  dmas400_main.StoredProcedure.Parameters.Refresh;

  dmas400_main.StoredProcedure.Parameters.ParamByName('@KZGR').Value := '3';
  dmas400_main.StoredProcedure.Parameters.ParamByName('@ZUKZ').Value := ' ';
  dmas400_main.StoredProcedure.ExecProc;

  ShowMessage(dmas400_main.StoredProcedure.Parameters.ParamValues['@Return']);
command
Delphi-Quellcode:
  Try

    dmas400_main.adocmd.CommandText := 'LIBARY.STOREDPROCEDURE1';
    dmas400_main.adocmd.Parameters.Refresh;

    dmas400_main.adocmd.Parameters.ParamByName('KZGR').Value := '3';
    dmas400_main.adocmd.Parameters.ParamByName('ZUKZ').Value := ' ';
    dmas400_main.adocmd.Execute;

  Except

    MessageDlg('Error Command', mtError, [mbOK], 0);

  End;

nahpets 8. Sep 2009 13:03

Re: ADO Query mit Parameter
 
Hallo,

die von Dir genutzte Syntax mit dem @ ist auch eher für MS-SQL gedacht, der Autor schreibt ja, dass er von DB2 nicht wirklich Ahnung hat. Das dort beschriebene muss daher nicht für jede Datenbank genau passen, es beschreibt nur das grundlegende Vorgehen.

Hilft die IBM direkt weiter? http://www.ibm.com/developerworks/da.../dm-0512swart/

Ansonsten bitte Google bemühen: delphi +stored +procedure +db2 eventuell ist da ja was brauchbares bei.

Bitte ändere die Fehlerbehandlung mal, damit sie aussagekräftiger wird:

zumindest in
Delphi-Quellcode:
try
  ...
Except
  on : e Exception do begin
    MessageDlg(e.Message, mtError, [mbOK], 0);
  end;
end;
dann erfährst Du (eventuell) die Fehlerursache.
Wenn's ein bisserl mehr sein darf:
Delphi-Quellcode:
Try
  ...
except
  on e : EAdoError do begin
    slError := TStringList.Create;
    slError.Add(e.Message);
    if ADOConnection1.Errors.Count > 0 then begin
      for i := 0 to ADOConnection1.Errors.Count - 1 do begin
        slError.Add('Number: ' + IntToStr(ADOConnection1.Errors.Item[i].Number));
        slError.Add('NativeError: ' + IntToStr(ADOConnection1.Errors.Item[i].NativeError));
        slError.Add('Description: ' + ADOConnection1.Errors.Item[i].Description);
        slError.Add('Source: ' + ADOConnection1.Errors.Item[i].Source);
        slError.Add('HelpFile: ' + ADOConnection1.Errors.Item[i].HelpFile);
        slError.Add('SQLState: ' + ADOConnection1.Errors.Item[i].SQLState);
        ShowMessage(slError.Text);
        slError.Free;
      end;
    end;
  end;
  on e : Exception do begin
    ShowMessage(e.Message);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz