Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi dbExpress und TSQLStoredProc Probleme mit Parameterübergabe (https://www.delphipraxis.net/46783-dbexpress-und-tsqlstoredproc-probleme-mit-parameteruebergabe.html)

cs.rumpelstilzchen 31. Mai 2005 15:43

Datenbank: MS-SQL • Version: 2000 • Zugriff über: dbExpress

dbExpress und TSQLStoredProc Probleme mit Parameterübergabe
 
Hallo Leute!

Folgendes Problem:
Ich hab in einer MS-SQL-Datenbank eine StoredProcedure:

CREATE PROC dbo.dk32_delete_depotR @iDepot INT

Die tut was sie soll, wenn ich sie per "EXECUTE dk32_delete_depotR 5" in einer Abfrage öffne.
Der Wert 5 in obigem Beispiel wird in der Variablen iDepot gespeichert und alles ist Prima!


Jetzt muß ich die Procedure aus Delphi heraus aufrufen. Dazu benutze ich die bestehende Datenbankverbindung:
Delphi-Quellcode:
function DeleteDbDepotListe(const iDepotR : Integer) : Byte;
begin
  with gMySqlServerObject.SQLStoredProc do
  begin
    StoredProcName := 'dk32_delete_depotR';
    Params.Clear;
    Params.CreateParam(ftFMTBcd,'RESULT',ptResult);
    Params.CreateParam(ftInteger,'iDepot',ptInput);
    ParamByName('iDepot').AsInteger := iDepotR;
    ExecProc;
  end;
end;
Das SQLStoredProc-Object ist in mein ServerObject wie folgt eingebunden:

Delphi-Quellcode:
type
  TMySqlServerObject = class(TObject)
    private
      MySqlServerConnectionData : TMySqlServerConnectionData;
      gbSqlServerConnected     : Boolean;
      gszLastErrorMessage      : String;
      SQLConnection            : TSQLConnection;
      SQLQuery                 : TSQLQuery;

    public
      SQLStoredProc            : TSQLStoredProc;
...
Beim Ausführen des ExecProc erhalte ich eine Fehlermeldung:
'Listenindex überschreitet das Maximum (0)'

Ich brüte jetzt schon ziemlich lange daran herum und hab auch schon alle mir bekannten Foren durchsucht. Es gibt dort Hinweise, das die dbExpress-Schnittstelle das Problem ist.

Wer kann helfen? :roll:

Ich benutze Delphi2005 mit Update 3.

THX

jensw_2000 1. Jun 2005 11:41

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
DB-Express benutze ich nicht, aber es muss ja generell so funktionieren wie bei ADO.

Delphi-Quellcode:
SP:=TAdoStoredProc.create(self);

try
  // Verbindungsparameter festlegen
  SP.Connection:=MeineAdoConnection;
 
  // SP auswählen
  SP.ProcedureName:='MeineSP';
 
  // Parameter der SP holen
  SP.Parameters.refresh; // <<< Denke das fehlt bei dir
 
  // Parameter - Values setzen
  SP.Parameters[1].Value:=1234; // Wichtig: Parameters[0] enthält den ReturnCode
  SP.Parameters[2].Value:='Hello';
  SP.Parameters[3].Value:='World';
  SP.Parameters[4].Value:=NULL;
 
  { Du kannst die Params auch wie gehabt füllen
    Params.Clear;
    Params.CreateParam(ftFMTBcd,'RESULT',ptResult);
    Params.CreateParam(ftInteger,'iDepot',ptInput);
    ParamByName('iDepot').AsInteger := iDepotR;
  }

  // SP ausführen
  SP.Execproc;

finally
  FreeAndNil(SP);
end;

Hoffentlich bringt es dich etwas weiter.

Schöne Grüße,
Jens

:hi:

cs.rumpelstilzchen 1. Jun 2005 13:46

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
Danke Jens, aber leider geht das mit dbExpress nicht. Da gibt's kein Refresh der Parameter! :cry:

Mit ADO hab ich noch nicht gearbeitet, hat das Vorteile gegenüber dbExpress?

Hat noch irgendjemand anderes ne Idee warum das mit dbExpress nicht hinhaut?

Thx
Jürgen

omata 1. Jun 2005 22:34

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
Moin,

welche Komponente verwendest du TSimpleDataSet oder TSQLStoredProc?
welche DbExpress-DLL verwendest du, die mitgelieferte von Borland oder eine von einem anderen Anbieter?

ich habe mal folgende Procedure im MSSQL-Server angelegt...

SQL-Code:
CREATE PROCEDURE TestProc @Input INT
AS
PRINT ''
GO
Aufruf in Delphi...
Delphi-Quellcode:
  SQLStoredProc.ParamByName('Input').AsInteger:=1;
  SQLStoredProc.ExecProc;
Das funktioniert bei mir wunderbar.

Wenn Werte aus der Procedure an Delphi übergeben werden sollen, dann geht das z.B. so...

SQL-Code:
CREATE PROCEDURE TestProc @Input INT
AS
SET @ausgabe1 = 101
SET @ausgabe2 = 102
SELECT @ausgabe1 AS Output1, @ausgabe2 AS Output2
GO
Aufruf in Delphi...
Delphi-Quellcode:
  SQLStoredProc.ParamByName('Input').AsInteger:=1;
  SQLStoredProc.Open;
  Output1:=SQLStoredProc.FieldByName('Output1').AsInteger;
  Output2:=SQLStoredProc.FieldByName('Output2').AsInteger;
  SQLStoredProc.Close;
Hoffe das hilft dir


MfG
Thorsten

cs.rumpelstilzchen 2. Jun 2005 09:46

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
Hallo Thorsten,
vielen Dank für die Hilfe zu später Stunde! :-D

Dein Beispiel funktioniert bei mir nicht! :wall: Vielleicht mache ich noch was falsch!!?! :gruebel:
Hier der StoredProc-Code:
SQL-Code:
CREATE PROCEDURE TestProc @Input INT
AS

DECLARE @ausgabe1 INT, @ausgabe2 INT
SET @ausgabe1 = 101 
SET @ausgabe2 = 102 
SELECT @ausgabe1 AS Output1, @ausgabe2 AS Output2
GO
und der Delphi-Aufruf dazu:

Delphi-Quellcode:
with gMySqlServerObject.SQLStoredProc do
  begin
  try
    StoredProcName := 'TestProc';
    ParamByName('Input').AsInteger := 1; // <- hier tritt der Fehler auf!!!!
    Open;
    iResult := ExecProc;
    Output1 := FieldByName('Output1').AsInteger;
    Output2 := FieldByName('Output2').AsInteger;
    Close;

    ShowMessage('ExecProc = '+inttostr(iResult));

    ShowMessage('Output1 = '+inttostr(Output1));

    ShowMessage('Output2 = '+inttostr(Output2));
  finally
    Free;

  end; // with gMySqlServerObject.SQLStoredProc do
Ich erhalte die Fehlermeldung: 'Parameter 'Input' nicht gefunden'

Und jetzt der Hit: Lasse ich diese Zeile Weg bekomme ich beim Open folgende Fehlermeldung:
'Datenbank-Server-Fehler: SQL State: 42000, SQL Error Code: 201
Die TestProc-Prozedur erwartet den @Input-Parameter; dieser wurde nicht übergeben.'


Das ist doch stark, oder? Erst findet er ihn nicht, dann will er ihn haben!!! :wall:

Zu deinen Fragen: Ich benutze TSQLStoredProc und die Borland dbExpress-dll.


Ich hab in meiner Not mal ein neues Formular erstellt und das TSQLConnection-Object aus dem Designer (dbExpress) benutzt. Das geht gar nicht! Ich erhalte beim Connect folgende Fehlermeldung noch bevor das Login (LoginPrompt ist true!) erscheint:
Zugriffsverletzung bei Adresse 40C180DE in Modul 'dbexpress90.bpl'. Lesen von Adresse 00000000.

Details:
[40C180DE]{dbexpress90.bpl} SqlExpr.TSQLConnection.SQLError (Line 1730, "SqlExpr.pas" + 24) + $B
[40005F5B]{rtl90.bpl } System.@HandleAnyException (Line 9625, "system.pas" + 13) + $0
[7C913786]{ntdll.dll } RtlConvertUlongToLargeInteger + $41
[7C91EAF5]{ntdll.dll } KiUserExceptionDispatcher + $9
[40C1C12E]{dbexpress90.bpl} SqlExpr.TSQLConnection.Check (Line 2919, "SqlExpr.pas" + 1) + $B
[403BF2AD]{dbrtl90.bpl } DB.TCustomConnection.SetConnected (Line 2506, "DB.pas" + 8) + $4
[0033BA66]{designide90.bpl} DesignEditors.TEnumProperty.SetValue (Line 1332, "DesignEditors.pas" + 5) + $6
[00A3D630]{vclide90.bpl} IDEInspListBox.TInspListBox.SetPropValue (Line 1144, "ideinsplistbox.pas" + 40) + $24
[00A3EC00]{vclide90.bpl} IDEInspListBox.TInspListBox.ListAccept (Line 1635, "ideinsplistbox.pas" + 6) + $7
[00A36FC2]{vclide90.bpl} IDEListBtns.TListButton.CloseUp (Line 752, "IDEListBtns.pas" + 14) + $12
[0053CF02]{vcl90.bpl } Controls.TWinControl.WndProc (Line 6673, "Controls.pas" + 51) + $4
[4003EEC0]{rtl90.bpl } Classes.StdWndProc (Line 11456, "classes.pas" + 8) + $0
[77D18731]{user32.dll } GetDC + $6A
[77D18811]{user32.dll } GetDC + $14A
[77D189C8]{user32.dll } GetWindowLongW + $122
[77D18A0B]{user32.dll } DispatchMessageW + $A


Im gleichen Formular hab ich dann mal die dbGo-Objekte benutzt. Also TADOConnection und TADOStoredProc. Das geht ohne Probleme! Der Connect geht sofort und die Stored Procedures werden mir automatisch angezeigt. Ausführen klappt auch problemlos!

Bin ich zu doof, oder ist dbExpress Murks? :wall:

Hiiiiiilfeeeeeeeeee.............

Marcel Gascoyne 2. Jun 2005 10:54

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
Zitat:

Zitat von cs.rumpelstilzchen
Ich erhalte die Fehlermeldung: 'Parameter 'Input' nicht gefunden'

Diese Fehlermeldung ist korrekt, da der Parameter nicht übergeben wurde.

Zitat:

Zitat von cs.rumpelstilzchen
Und jetzt der Hit: Lasse ich diese Zeile Weg bekomme ich beim Open folgende Fehlermeldung:
'Datenbank-Server-Fehler: SQL State: 42000, SQL Error Code: 201
Die TestProc-Prozedur erwartet den @Input-Parameter; dieser wurde nicht übergeben.'

Ist auch korrekt, da der Parameter @Input nicht übergeben wurde. Beachte das @ !!!
SQL-Server Parameter werden mit einem @ eingeleitet, so musst Du auch die Parameter angeben, also z.b.

Delphi-Quellcode:
SQLStoredProc.Params.CreateParam(ftInteger,'@Input',ptInput);
SQLStoredProc.ParamByName('@Input').AsInteger := 1;
Gruß,
Marcel

cs.rumpelstilzchen 2. Jun 2005 11:04

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
Hallo Marcel, danke für deinen Beitrag.

Aber bist du dir da sicher? Ich habs grad probiert:
Fehler -> 'Parameter '@Input' nicht gefunden' :gruebel:

In der Borland-Hilfe zu diesem Thema stehen in den Beispielen auch keine @-Zeichen vor den Variablen!

Bin für jede Hilfe äußerst dankbar!

By the way: Ist dbGo (ADO) besser als dbExpress? Wer hat Erfahrung?

Marcel Gascoyne 2. Jun 2005 11:10

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
Zitat:

Zitat von cs.rumpelstilzchen
In der Borland-Hilfe zu diesem Thema stehen in den Beispielen auch keine @-Zeichen vor den Variablen!

Ich bin mir ziemlich sicher, dass es so funktionieren muß, hier ein Beispiel aus einer unserer Anwendungen:

Delphi-Quellcode:
  with spRcChk do
  begin
    StoredProcName := Format(K_SPNAME_RC_CHK,[GetDBVersion]);
    Params.Clear;
    Params.CreateParam(ftInteger,'Result',ptResult);
    Params.CreateParam(ftSmallint,'@DEBNO',ptInput);
    Params.CreateParam(ftSmallint,'@KAPVON',ptInput);
    Params.CreateParam(ftSmallint,'@KAPBIS',ptInput);

    ParamByName('@DEBNO').AsInteger := 0;
    ParamByName('@KAPVON').AsInteger := K_WERB_FIKUKUSEL_WMIT;
    ParamByName('@KAPBIS').AsInteger := K_WERB_FIKUKUSEL_WMIT;

    Open;
  end;
Gruß,
Marcel

cs.rumpelstilzchen 2. Jun 2005 11:21

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
In deinem Beispiel steht vor dem Open noch Params.Clear und Params.CreateParam. Ich hab das auch probiert:
Delphi-Quellcode:
with gMySqlServerObject.SQLStoredProc do
  begin
  try
    StoredProcName := 'TestProc';
    Params.Clear;
    Params.CreateParam(ftInteger,'Result',ptResult);
    Params.CreateParam(ftInteger,'@Input',ptInput);
    ParamByName('@Input').AsInteger := 1;
    Open;
    iResult := ExecProc;
    Output1 := FieldByName('Output1').AsInteger;
    Output2 := FieldByName('Output2').AsInteger;
    Close;

    ShowMessage('ExecProc = '+inttostr(iResult));

    ShowMessage('Output1 = '+inttostr(Output1));

    ShowMessage('Output2 = '+inttostr(Output2));
  finally
    Free;

  end; // with gMySqlServerObject.SQLStoredProc do

end;
Beim Open tritt folgende Fehler auf:

Im Projekt ... ist eine Exception der Klasse EListError mit der Meldung 'Listenindex überschreitet das Maximum (0)' aufgetreten.

Marcel Gascoyne 2. Jun 2005 13:51

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
 
Das ganze sieht mir bei Dir sehr seltsam aus, versuch mal als erstes die With-Anweisung durch explizite Zuweisung zu ersetzen und lass das ganze dann mal im Debugger laufen um den Fehler einzugrenzen.

Gruß,
Marcel


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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