Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Stored Procedure Aufruf Fehler (https://www.delphipraxis.net/48287-stored-procedure-aufruf-fehler.html)

Sven Janssen 23. Jun 2005 08:36

Datenbank: Informix • Version: 7SE • Zugriff über: Luxena

Stored Procedure Aufruf Fehler
 
Morgen.

ich möchte über die Komponente TSQLStoredProc eine Stored Procedure aufrufen.
Die Komponente zeigt mir meine SP an und fügt auch die korrekt Anzahl von Parametern hinzu.

Ich erhalte beim aktivieren oder mit dem Aufruf execproc die Fehlermeldung

Data type 0 (subtype 0) is unsupported

Jemand ne Idee woher die kommt.

Sven

marabu 23. Jun 2005 09:12

Re: Stored Procedure Aufruf Fehler
 
Hallo Sven,

hast du nach dem Besetzen der Parameter TStoredProc.Prepared auf TRUE gesetzt?

Grüße vom marabu

Sven Janssen 23. Jun 2005 09:29

Re: Stored Procedure Aufruf Fehler
 
Ja habe ich.

Sven

marabu 23. Jun 2005 09:41

Re: Stored Procedure Aufruf Fehler
 
Manchmal sind ja die Fehlermeldungen direkt interpretierbar. Vielleicht hast du bei irgendeinem Parameter einen Datentyp verwendet, der von Informix SP nicht unterstützt wird.

marabu

Sven Janssen 23. Jun 2005 10:04

Re: Stored Procedure Aufruf Fehler
 
Die Stored Procedure funktioniert.
Wenn ich diese im Server selber anstarte wird sie korrekt ausgeführt.

Hier mal den Header der procedure:
Delphi-Quellcode:
create procedure saveKomCom(auftrag char(6) ,nummer char(30) ,was char(5) )
Sven

marabu 23. Jun 2005 10:27

Re: Stored Procedure Aufruf Fehler
 
Vielleicht müssen wir am anderen Ende anfangen. Zeig doch mal den Code mit dem du die SP in Delphi erzeugst. Du arbeitest ja mit TStoredProc, aber bei mir würde das so aussehen:

Delphi-Quellcode:
var
  sp: TADOStoredProc;
begin
  sp := TADOStoredProc.Create(nil);
  with sp do begin
    Connection := adoConnection;
    ProcedureName := 'saveKomCom;1';
    Parameters.CreateParameter('auftrag', ftString, pdInput, 6, '');
    Parameters.CreateParameter('nummer', ftString, pdInput, 30, '');
    Parameters.CreateParameter('was', ftString, pdInput, 5, '');
    Prepared := true;
  end;
end;
marabu

Sven Janssen 23. Jun 2005 11:06

Re: Stored Procedure Aufruf Fehler
 
Ich habe das eben in der IDE gemacht.

So nun habe ich folgenden Code
Delphi-Quellcode:
var dbproc: TSQLStoredProc;
begin

    dbproc:=TSQLStoredProc.Create(nil);

    dbproc.SQLConnection:=db;
    dbproc.StoredProcName:= 'saveKomCom';

    showmessage(inttostr(dbproc.Params.Count));

    with dbproc.Params.CreateParam(ftInteger, 'auftrag', ptInput) do asstring := '100006';
    with dbproc.Params.CreateParam(ftInteger, 'nummer', ptInput) do asstring := 'sven@stalkingwolf.de';
    with dbproc.Params.CreateParam(ftInteger, 'was', ptInput) do asstring := 'eMail';

    dbproc.Prepared := true;
    showmessage('davor');
    dbproc.open;

    dbproc.close;
    showmessage('danach');
    dbproc.free;
end;
Nun ist es ganz lustig.
Gebe ich als StoredProcName = saveKomCom mit dann spuckt das showmessage danach 0 für params.count aus. und das open gibt als Fehlermeldung aus : Listenindex überschreitet das Maximum(0).
Lasse ich die drei createParam weg, dann meckert er :-696 SQL error : Variable (auftrag) has undefined value. Setze ich über
Delphi-Quellcode:
dbproc.ParamByName('auftrag').AsString:='100006';
den value erhalte ich die Meldung Parameter auftrag nicht gefunden.
Setze ich über dbproc.ParamByName('1').AsString:='100006'; dann erhalte ich die Meldung : -694 SQL error : Too many arguments passed to procedure

Gebe ich als StoredProcName = savekomcom mit, dann erhalte ich als param.count 3 zurück. Setze ich über
Delphi-Quellcode:
dbproc.ParamByName('1').AsString:='100006';
den value erhalte ich die Meldung : Data type 0 (subtype 0) is unsupported .

----------------------
Wenn ich eine SP ohne Parameter aufrufe, dann läuft diese durch. Liegt also wohl an den Parametern.

Sven

marabu 23. Jun 2005 12:07

Re: Stored Procedure Aufruf Fehler
 
Du kannst die SP einmal erzeugen und mehrmals benutzen. Du solltest mit ExecProc arbeiten, wenn deine SP keinen result set produziert.

Zitat:

Zitat von Sven Janssen
Gebe ich als StoredProcName = saveKomCom mit dann spuckt das showmessage danach 0 für params.count aus. ... Gebe ich als StoredProcName = savekomcom mit, dann erhalte ich als param.count 3 zurück.

Willst du damit sage, dass die Namenseigenschaft case sensitive ist? Kann man mit leben...

Zitat:

Zitat von Sven Janssen
Setze ich über dbproc.ParamByName('1').AsString:='100006'; dann erhalte ich die Meldung : -694 SQL error : Too many arguments passed to procedure

Parameter "1" gibt es wohl auch nicht - oder?

marabu

Sven Janssen 23. Jun 2005 12:45

Re: Stored Procedure Aufruf Fehler
 
Case Sensitive ist gut.
Die sollte groß geschrieben werden und genau das kennt er nicht. Er möchte sie immer klein geschrieben haben.

Folgendes kleines Bespiel funktioniert auch nicht:
Delphi-Quellcode:
create procedure test(was int)
    returning int;

    return was;
end procedure;
Delphi-Quellcode:
    dbproc:=TSQLStoredProc.Create(nil);
    dbproc.SQLConnection:=db;
    dbproc.StoredProcName := 'test';
    dbproc.Params.Clear;
    with dbproc.Params.CreateParam(ftInteger, 'was', ptInput) do asinteger := 1;
    dbproc.Prepared := true;
    dbproc.ExecProc;
    dbproc.free;
Gleiche Meldung wie immer Data type 0 (subtype 0) is unsupported

Sven

marabu 23. Jun 2005 13:35

Re: Stored Procedure Aufruf Fehler
 
Wenn ich meine SP in MSSQL eingestellt habe und dann in der Delphi IDE ein Datenmodul anlege, eine TADOConnection draufziehe und die Verbindung zur Datenbank herstelle, eine TADOStoredProc mit der ADOConnection verbinde, dann kann ich den ProcedureName aus einer DropDownList auswählen. Nach meiner Auswahl sind alle Parameter korrekt initialisiert.

Wenn ich die SP dynamisch erzeuge, dann muss ich selbst für die Parameter sorgen. Damit ich keine Fehler mache, übernehme ich die Angaben, die ich vorher auf die obige Weise aus der Datenbank habe holen lassen.

Wenn das bei dbExpress auch so funktioniert, dann solltest du so erkennen können, ob du die Werte korrekt eingetragen hast. Einen Versuch wäre es wert...

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:08 Uhr.
Seite 1 von 2  1 2      

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