Avatar billede hrc Mester
27. september 2006 - 11:11 Der er 1 kommentar og
1 løsning

TADOStoredProcedure parametre ved runtime-oprettelse

Jeg opretter mine StoredProcs løbende og har opdaget, at de parametre som procedurerne indeholder, ikke indsættes automatisk - sådan som de gør i "Design mode".

Er der en måde at hente disse parametre eller skal de oprettes manuelt bagefter?

Bruger som nævnt TADOStoredProc og dette på en MS-SQL database (syntaks: T-Sql)

Et tillægsspørgsmål:

Jeg kan enten vælge at gruppere procedurerne således, at den ene indsætter og den anden opdaterer en record: SetTest;1 og SetTest;2:

CREATE PROCEDURE [dbo].[SetTest];1 @ref int OUTPUT, @navn varchar(20)
AS
  INSERT INTO Test (navn) values (@navn)
  SET @ref = SCOPE_IDENTITY()
GO

CREATE PROCEDURE [dbo].[SetTest];2 @ref int, @navn varchar(20)
AS
  UPDATE Test SET navn = @navn where ref = @ref
GO

eller jeg kan have det samlet i én procedure:

CREATE PROCEDURE [dbo].[SetTest2] @ref int OUTPUT, @navn varchar(20)
AS
  IF @ref = 0
  BEGIN
    INSERT INTO Test (navn) values (@navn)
    SET @ref = SCOPE_IDENTITY()
  END
  ELSE
    UPDATE Test SET navn = @navn where ref = @ref
GO

Hvad er bedst? Er der noget der taler for eller imod de to løsninger? Sidstnævntes plus er, at hvis jeg ikke kan oprette TADOStoredProc'erne løbende, så skal jeg kun have én komponent i mit TDataModule
Avatar billede hrc Mester
27. september 2006 - 11:12 #1
Rettelse, den sidste procedure set således ud:

CREATE PROCEDURE [dbo].[SetTest3] @ref int, @navn varchar(20), @new_ref int OUTPUT
AS
  SET @new_ref = 0
 
  IF @ref = 0
  BEGIN
    INSERT INTO Test (navn) values (@navn)
    SET @new_ref = SCOPE_IDENTITY()
  END
  ELSE
    UPDATE Test SET navn = @navn where ref = @ref
GO
Avatar billede hrc Mester
18. oktober 2006 - 10:43 #2
Det kunne nu godt lade sig gøre alligevel. Funktionen nedenfor får i alt fald hentet alle parametrene:

function TDM.CreateStoredProc(const aName : string; const aIndex : integer = 1): TADOStoredProc;
begin
  result := TADOStoredProc.Create(nil);
  result.Connection := ADOConnection;
  result.ProcedureName := format('%s;%d',[aName,aIndex]);
  result.Prepared := true;
  result.Parameters.Refresh;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester