![]() |
Datenbank: SQL Express • Version: 2003 • Zugriff über: ADO
Fehler beim ausführen einer SP (Param nicht bereitgestellt)
Hai,
irgendwie scheine ich mich zu dumm anzustellen. Ich möchte über eine SP Daten in eine Tabelle eintragen und die ID des letzten Datensatzes zurück bekommen. Meine SP sieht so aus:
SQL-Code:
Wenn ich das über die Managementkonsole teste funktionert das auch.
USE [schluessel]
GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE Procedure [dbo].[Benutzer_Neu] @vorname VarChar (50), @nachname VarChar(50), @anmeldename VarChar(50), @kennwort VarChar(50), @lastID int output as begin set nocount on insert into benutzer (vorname, nachname, anmeldename, kennwort) Values (@vorname, @nachname, @anmeldename, @kennwort) select @lastID = @@Identity set nocount on end In Delphi rufe ich das dann so auf:
Delphi-Quellcode:
Aber ich bekomme immer diese Fehlermeldung:
procedure TMain_Form.Button1Click(Sender: TObject);
var lastID : Integer; begin with DataModule1.ADOStoredProc1 do begin Parameters.Refresh; Parameters.ParamValues['@vorname'] := 'Vorname'; Parameters.ParamValues['@nachname'] := 'Nachname'; Parameters.ParamValues['@anmeldename'] := 'Anmeldename'; Parameters.ParamValues['@kennwort'] := 'Kennwort'; ExecProc; lastID := Parameters.ParamValues['@lastID']; end; end; Die Prozedur oder Funktion 'Benutzer_Neu' erwartet den '@lastID'-Parameter, der nicht bereitgestellt wurde. |
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
Der Parameter ist ja beim Aufruf null. Auch wenn du ihn nicht brauchst, hast du schonmal versucht ihm trotzdem einen Wert mitzugeben? Alternativ könntest du auch eine Stored Function daraus machen, die als Ergebnis die ID zurückliefert.
|
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
Moin Stephan,
der Fehler steckt nicht in der Benutzung der StoredProc, sondern in der Vorbereitung:
Delphi-Quellcode:
Freundliche Grüße
begin
spBenutzerNeu := TADOStoredProc.Create(nil); with spBenutzerNeu do begin Connection := SqlConnection; ProcedureName := 'Benutzer_Neu;1'; Parameters.CreateParameter('@vorname', ftString, pdInput, 50, ''); Parameters.CreateParameter('@nachname', ftString, pdInput, 50, ''); Parameters.CreateParameter('@anmeldename', ftString, pdInput, 50, ''); Parameters.CreateParameter('@kennwort', ftString, pdInput, 50, ''); Parameters.CreateParameter('@lastid', ftInteger, pdOutput, 0, 0); Prepared := True; end; end; |
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
Wie hast Du deine TADOStoredProcedure initialisiert? Ich meine, im Designer? Doppelklick auf die Params-Eigenschaft und prüfe, ob alle Parameter vorhanden sind. Wenn nicht, gib in der Eigenschaft 'ProcedureName' einen anderen Namen ein und drücke ENTER. Nun liest ADO die Parameter-Definition für diese SP neu ein. Anschließend gibtst du wieder den "Benutzer_Neu" ein und prüfst die Params-Eigenschaft. Das sollte funktieren.
marabu zeigt, wie man es zur Laufzeit macht. Wenn nicht, schließt Du im Designer die TADOConnection und baust sie wieder auf (Connected: False und wieder True). Dann wiederholst Du o.g. Prozedere. Dann klappt es garantiert. @Codewalker: Ein Parameter kann doch den Wert NULL haben. Das Problem ist, das der Parameter nicht in der Params-Collection vorhanden ist. Tipp: Verwende immer einen Profiler/Monitor, wenn Du mit einer DBMS arbeitest. Dann siehst du genau, was ADO für einen Murks zusammenbastelt. |
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
@alzaimar: Was sind denn das für Profiler? Gibt's dir für alle DBMS (konkret: Oracle (denke doch schon)).
|
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
Liste der Anhänge anzeigen (Anzahl: 1)
Hai ihr,
danke für die Antworten. Mit dem Code von marabu funktioniert es. Ich hatte es auch schon gemacht die Parameter von Hand zu erzeugen. Aber warum geht es nicht wenn ich "einfach" die Parameter mit Parameters.Refresh abfrage. @alzaimar: Schon zur Laufzeit sind die Parameter vorhanden (siehe Anhang) darum wundert es mich ja das ich die Fehlermeldung bekomme. |
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
Parameters.Refresh() scheint die Direction nicht erkennen zu können.
|
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
Zitat:
Delphi-Quellcode:
Kommt als Ergebniss:
procedure TMain_Form.Button3Click(Sender: TObject);
var I: Integer; begin with DataModule1.sp_benutzer_neu do begin Parameters.Refresh; for I := 0 to Parameters.Count - 1 do begin ListBox1.Items.Add(Format ('%s - %d',[Parameters[i].Name, Ord(Parameters[i].Direction)])); end; end; end;
Code:
Dürfte doch stimmen.
@RETURN_VALUE - 4
@vorname - 1 @nachname - 1 @anmeldename - 1 @kennwort - 1 @lastID - 3 |
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
Nein, @lastid - 2 wäre richtig.
|
Re: Fehler beim ausführen einer SP (Param nicht bereitgestel
Zitat:
so würde man denken ;-) Aber wenn ich in deinem Beispiel oben:
Delphi-Quellcode:
eintrage (pdOutput durch pdInputOutput ersetzt) funktioniert es trotzdem ohne Fehler.
Parameters.CreateParameter('@lastid', ftInteger, pdInputOutput, 0, 0);
Wo ist der Unterschied ob das pdInputOutput via CreatParameter gesetzt wird oder ob es aus der SP kommt? Aber irgend wie muss es daran liegen. Wenn ich meinen Code so ändere funktioniert es. Allerdings nur beim ersten Aufruf. Beim nächsten kommt eine Zugriffsverletzung in der sqloledb.dll :roll:
Delphi-Quellcode:
Ich habe ja kein Problem die Parameter im Code zu definieren. Aber ich würde gerne verstehen warum es zu diesem Verhalten kommt.
procedure TMain_Form.Button1Click(Sender: TObject);
begin with DataModule1.sp_benutzer_neu do begin Parameters.Refresh; Parameters.ParamByName('@lastID').Direction := pdOutput; // Direction für @lastID setzen. Parameters.ParamValues['@vorname'] := Edit1.Text; Parameters.ParamValues['@nachname'] := Edit2.Text; Parameters.ParamValues['@anmeldename'] := Edit3.Text; Parameters.ParamValues['@kennwort'] := Edit4.Text; Prepared := True; ExecProc; Edit5.Text := Parameters.ParamValues['@lastID']; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 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 by Thomas Breitkreuz