![]() |
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:
Das SQLStoredProc-Object ist in mein ServerObject wie folgt eingebunden:
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;
Delphi-Quellcode:
Beim Ausführen des ExecProc erhalte ich eine Fehlermeldung:
type
TMySqlServerObject = class(TObject) private MySqlServerConnectionData : TMySqlServerConnectionData; gbSqlServerConnected : Boolean; gszLastErrorMessage : String; SQLConnection : TSQLConnection; SQLQuery : TSQLQuery; public SQLStoredProc : TSQLStoredProc; ... '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 |
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: |
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 |
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:
Aufruf in Delphi...
CREATE PROCEDURE TestProc @Input INT
AS PRINT '' GO
Delphi-Quellcode:
Das funktioniert bei mir wunderbar.
SQLStoredProc.ParamByName('Input').AsInteger:=1;
SQLStoredProc.ExecProc; Wenn Werte aus der Procedure an Delphi übergeben werden sollen, dann geht das z.B. so...
SQL-Code:
Aufruf in Delphi...
CREATE PROCEDURE TestProc @Input INT
AS SET @ausgabe1 = 101 SET @ausgabe2 = 102 SELECT @ausgabe1 AS Output1, @ausgabe2 AS Output2 GO
Delphi-Quellcode:
Hoffe das hilft dir
SQLStoredProc.ParamByName('Input').AsInteger:=1;
SQLStoredProc.Open; Output1:=SQLStoredProc.FieldByName('Output1').AsInteger; Output2:=SQLStoredProc.FieldByName('Output2').AsInteger; SQLStoredProc.Close; MfG Thorsten |
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:
und der Delphi-Aufruf dazu:
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
Delphi-Quellcode:
Ich erhalte die Fehlermeldung: 'Parameter 'Input' nicht gefunden'
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 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............. |
Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
Zitat:
Zitat:
SQL-Server Parameter werden mit einem @ eingeleitet, so musst Du auch die Parameter angeben, also z.b.
Delphi-Quellcode:
Gruß,
SQLStoredProc.Params.CreateParam(ftInteger,'@Input',ptInput);
SQLStoredProc.ParamByName('@Input').AsInteger := 1; Marcel |
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? |
Re: dbExpress und TSQLStoredProc Probleme mit Parameterüberg
Zitat:
Delphi-Quellcode:
Gruß,
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; Marcel |
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:
Beim Open tritt folgende Fehler auf:
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; Im Projekt ... ist eine Exception der Klasse EListError mit der Meldung 'Listenindex überschreitet das Maximum (0)' aufgetreten. |
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 11:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz