Einzelnen Beitrag anzeigen

Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

SP - UPSERT: Verständnisfrage zu Param nicht bereitgestellt

  Alt 18. Apr 2011, 09:08
Datenbank: MS SQL 2005 • Version: Express • Zugriff über: ADO
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
  Mit Zitat antworten Zitat