Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SP - UPSERT: Verständnisfrage zu Param nicht bereitgestellt (https://www.delphipraxis.net/159900-sp-upsert-verstaendnisfrage-zu-param-nicht-bereitgestellt.html)

Piro 18. Apr 2011 09:08

Datenbank: MS SQL 2005 • Version: Express • Zugriff über: ADO

SP - UPSERT: Verständnisfrage zu Param nicht bereitgestellt
 
Moin zusammen,

ich habe mir heute die Stored Procedures angesehen, da ich demnächst einen Datenimport von mehr als 1.000.000 Datensätzen vornehmen muss.

Meine Test "UPSERT" Prozedure sieht wie folgt aus.
Delphi-Quellcode:
USE [KECDB_TEST]
GO
/****** Objekt: StoredProcedure [dbo].[sp_upsert]   Skriptdatum: 04/18/2011 08:11:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_upsert]

   -- Add the parameters for the stored procedure here
   @snr nvarchar(9),
   @b_ftag nvarchar(4),
   @b_datum nvarchar(8)
AS
SET transaction isolation level SERIALIZABLE
SET NOCOUNT ON
BEGIN TRANSACTION Upsert
   
   update mat_beweg set snr    = @snr,
                         b_ftag = @b_ftag,
                         b_datum = @b_datum
               where snr = @snr

   if @@rowcount = 0 and @@error=0
   begin
      insert into mat_beweg (snr, b_ftag, b_datum)
                    values (@snr, @b_ftag, @b_datum)
   end
COMMIT TRANSACTION Upsert
Wenn ich die Prozedure im MS SQL Server Management Studio ausführe, funktioniert alles besten. Wenn ich es die Prozedure im Program aufrufe, siehe Quellcode unten, kam ein Fehler.
Zitat:

Die Prozedur oder Funktion 'sp_upsert' erwartet den '@snr'-Parameter, der nicht bereitgestellt wurde.
Dazu habe ich folgenden Artikel hier im Forum gefunden, der mein Problem erklärt.
http://www.delphipraxis.net/107836-f...tgestellt.html

Mein Program sieht jetzt wie folgt aus und funktioniert.
Delphi-Quellcode:

ConnectToSQLServer; // Funktion zum Aufbau der SQL Verbindung
...
with sp_upsert do
begin
  ProcedureName := 'sp_upsert';
  Prepared;

// ---> 1. Versuch: Resultat: Fehler
//   Parameters.ParamByName('snr').Value    := '210210210';
//   Parameters.ParamByName('b_ftag').Value := '6272';
//   Parameters.ParamByName('b_datum').Value := '20110418';

// ---> 2. Versuch: Resultat: Fehler
//   Parameters.ParamValues['@snr']    := '210210210';
//   Parameters.ParamValues['@b_ftag'] := '6272';
//   Parameters.ParamValues['@b_datum'] := '20110418';

// ---> 3. Versuch: alles OK
  for i := 0 to 10000 do
  begin
    Parameters.Clear;
    Parameters.CreateParameter('@snr',    ftString, pdInput, 9, IntToStr(i));
    Parameters.CreateParameter('@b_ftag', ftString, pdInput, 4, '6272');
    Parameters.CreateParameter('@b_datum', ftString, pdInput, 8, FormatDateTime('hh:nn:ss', now));
    ExecProc;
  end;
end;
Was ich nicht verstehe, warum muss man die Parameter erstellen? Sie sind doch schon laut sp_upsert Prozedure definiert und man müsst doch ohne weiteres darauf zu greifen können, wie Versuch 1-2 zeigen.
Wäre nett, wenn mir dazu einer eine kleine Erklärung geben könnte. Eventuell ist ja der Quellcode aus dem 3. Versuch nicht wirklich die Lösung und es geht noch besser.

Danke im Voraus.
Sven

Sir Rufo 18. Apr 2011 09:54

AW: SP - UPSERT: Verständnisfrage zu Param nicht bereitgestellt
 
Versuch es mal so
Delphi-Quellcode:
ConnectToSQLServer; // Funktion zum Aufbau der SQL Verbindung
...
with sp_upsert do
begin
  ProcedureName := 'sp_upsert';

  // Parameter-Liste aktualisieren
  Parameters.Refresh;

  // So wird Prepared :o)
  Prepared := True;

  for i := 0 to 10000 do
  begin
    Parameters.ParamValues['@snr'] := '210210210';
    Parameters.ParamValues['@b_ftag'] := '6272';
    Parameters.ParamValues['@b_datum'] := '20110418';
    ExecProc;
  end;

  //
  Prepared := False;
end;
Ansonsten musst du das halt durch ParseSQL laufen lassen

Piro 18. Apr 2011 10:15

AW: SP - UPSERT: Verständnisfrage zu Param nicht bereitgestellt
 
Vielen Dank. Das hat geklappt.

Schönen Tag noch.


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