AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi dbExpress und TSQLStoredProc Probleme mit Parameterübergabe
Thema durchsuchen
Ansicht
Themen-Optionen

dbExpress und TSQLStoredProc Probleme mit Parameterübergabe

Ein Thema von cs.rumpelstilzchen · begonnen am 31. Mai 2005 · letzter Beitrag vom 3. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von cs.rumpelstilzchen
cs.rumpelstilzchen

Registriert seit: 16. Sep 2004
Ort: NRW
72 Beiträge
 
Delphi XE4 Professional
 
#1

dbExpress und TSQLStoredProc Probleme mit Parameterübergabe

  Alt 31. Mai 2005, 16:43
Datenbank: MS-SQL • Version: 2000 • Zugriff über: dbExpress
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?

Ich benutze Delphi2005 mit Update 3.

THX
Der weiß, daß er nichts weiß, wie alle anderen auch nichts wissen.
Nur weiß er, was die anderen und auch er selbst noch lernen müssen.
(Novalis 1772 - 1801)
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 1. Jun 2005, 12:41
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

  Mit Zitat antworten Zitat
Benutzerbild von cs.rumpelstilzchen
cs.rumpelstilzchen

Registriert seit: 16. Sep 2004
Ort: NRW
72 Beiträge
 
Delphi XE4 Professional
 
#3

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 1. Jun 2005, 14:46
Danke Jens, aber leider geht das mit dbExpress nicht. Da gibt's kein Refresh der Parameter!

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
Der weiß, daß er nichts weiß, wie alle anderen auch nichts wissen.
Nur weiß er, was die anderen und auch er selbst noch lernen müssen.
(Novalis 1772 - 1801)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 1. Jun 2005, 23:34
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
  Mit Zitat antworten Zitat
Benutzerbild von cs.rumpelstilzchen
cs.rumpelstilzchen

Registriert seit: 16. Sep 2004
Ort: NRW
72 Beiträge
 
Delphi XE4 Professional
 
#5

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 2. Jun 2005, 10:46
Hallo Thorsten,
vielen Dank für die Hilfe zu später Stunde!

Dein Beispiel funktioniert bei mir nicht! Vielleicht mache ich noch was falsch!!?!
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!!!

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?

Hiiiiiilfeeeeeeeeee.............
Der weiß, daß er nichts weiß, wie alle anderen auch nichts wissen.
Nur weiß er, was die anderen und auch er selbst noch lernen müssen.
(Novalis 1772 - 1801)
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#6

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 2. Jun 2005, 11:54
Zitat von cs.rumpelstilzchen:
Ich erhalte die Fehlermeldung: 'Parameter 'Input' nicht gefunden'
Diese Fehlermeldung ist korrekt, da der Parameter nicht übergeben wurde.

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
Marcel Gascoyne
Der Fehler sitzt immer vor der Tastatur
  Mit Zitat antworten Zitat
Benutzerbild von cs.rumpelstilzchen
cs.rumpelstilzchen

Registriert seit: 16. Sep 2004
Ort: NRW
72 Beiträge
 
Delphi XE4 Professional
 
#7

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 2. Jun 2005, 12:04
Hallo Marcel, danke für deinen Beitrag.

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

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?
Der weiß, daß er nichts weiß, wie alle anderen auch nichts wissen.
Nur weiß er, was die anderen und auch er selbst noch lernen müssen.
(Novalis 1772 - 1801)
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#8

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 2. Jun 2005, 12:10
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
Marcel Gascoyne
Der Fehler sitzt immer vor der Tastatur
  Mit Zitat antworten Zitat
Benutzerbild von cs.rumpelstilzchen
cs.rumpelstilzchen

Registriert seit: 16. Sep 2004
Ort: NRW
72 Beiträge
 
Delphi XE4 Professional
 
#9

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 2. Jun 2005, 12:21
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.
Der weiß, daß er nichts weiß, wie alle anderen auch nichts wissen.
Nur weiß er, was die anderen und auch er selbst noch lernen müssen.
(Novalis 1772 - 1801)
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#10

Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg

  Alt 2. Jun 2005, 14:51
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
Marcel Gascoyne
Der Fehler sitzt immer vor der Tastatur
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 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