Avatar billede soerens Nybegynder
09. maj 2001 - 10:52 Der er 13 kommentarer og
1 løsning

Hente return value fra en Stored Procedure

Hej!

Er der nogen der ved om der er andre måder at hente en return value fra en stored procedure end vha. et command object?

Eller er det den eneste måde at gøre det på?

Normalt kalder jeg en sp vha. ganske almindelig SQL, f.eks.:

strSQL = \"udpMyProc \'Param1\', \'Param2\'\"
cnnDatabase.Execute strSQL

Det ville være rart at kunne undgå at oprette et command object bare for at aflæse en return value, og så vidt jeg har kunnet læse i MSDN Library så er det heller ikke det primære formål med objektet.

Mhv.
SørenS.
Avatar billede winkill Nybegynder
09. maj 2001 - 11:10 #1
Jeg plejer at gøre det gennem et standard record med Set RS = Conn.Execute(\"MyProc \'Param1\', \'Param2\')

Her er et par eksempler på hvordan MyProc kunne se ud for at den returnerer et record/recordset.

CREATE PROCEDURE MyProc @param1 varchar(64) AS
-- Her returneres enten indholdet af @RetNoItems eller @RetItems.
-- I eks. ASP kan retur værdien hentes med RS(\"vcRetVal\")
  DECLARE @CountItems int;
  DECLARE @RetNoItems varchar(32);
  DECLARE @RetItems varchar(32);
  SET @RetNoItems = \'Der blev ikke fundet en disse\';
  SET @RetItems = \'Der blev vidst fundet flere stk.\';
  SELECT @CountItems = COUNT(DISTINCT ID) FROM tbItems WHERE vcType = @param1;
  IF @CountItems = 0
  BEGIN
    SELECT @RetNoItems AS vcRetVal;
  END
  ELSE
  BEGIN
    SELECT @RetItems AS vcRetval;
  END
GO

CREATE PROCEDURE MyProc @param1 varchar(64) AS
-- Her returneres et reelt recordset
  SELECT * FROM tbItems WHERE vcType = @param1;
GO
Avatar billede soerens Nybegynder
09. maj 2001 - 11:18 #2
Ja, nemt nok at hente et recordset, men hvis man bare skal bruge en statusværdi for om operationen er gået godt/skidt, så er return values den \"rigtige\" måde at gøre det på.

Man kunne selvfølgelig bare \"returnere\" et recordset med statusværdien, men jeg tænkte på om man ikke kan få hentet \"return value\" uden at skabe det ekstra Command/Recordset objekt?

/SørenS.
Avatar billede winkill Nybegynder
09. maj 2001 - 11:27 #3
Det kan du sagtens gøre på samme måde, men det er dog kun en \"kosmetisk\" løsning.

Returnerer du eks. en værdi gennem en SELECT @retval as RetVal; i din stored proceduren, kan du hente værdien i ASP gennem:

Response.Write(Conn.Execute(\"MyProc \'param1\', \'param2\')(\"RetVal\"))
Avatar billede soerens Nybegynder
09. maj 2001 - 11:36 #4
Hmmmmm, det ser interessant ud....

Men vil det ikke alligevel skabe et recordset objekt?

Hvis ja, så får man lidt problemer med at nedlægge det manuelt lidt senere, da man ikke har gemt en reference til det.

/SørenS.
Avatar billede winkill Nybegynder
09. maj 2001 - 11:40 #5
Jo det er en ren kosmetisk løsning og der bliver instantieret et recordset hvilket er et problem på eks. en NT/4 hvorimod det ikke betyder det store på en NT/2000 med mindre command/connection-timeout for connection er sat til ekstraordinært højt.
Avatar billede winkill Nybegynder
09. maj 2001 - 11:41 #6
Nu vi er ved det, så skulle recordset-objektet gerne slette sig selv så snart kommandoen er udført, da der jo ikke er nogen reference til det. Den gør det i hvert tilfælde på NT/2000, men jeg har ikke testet det på NT4
Avatar billede winkill Nybegynder
09. maj 2001 - 11:44 #7
Eh, giver RETURN 10 ikke en returværdi som kan bruges direkte ?
Response.Write(Conn.Execute(\"MyProc \'param1\'))

CREATE PROCEDURE MyProc @param1 varchar(64) AS
-- Her returneres et reelt recordset
  IF @param1 = \'no habla espanol\'
  BEGIN
    RETURN 1
  END
  ELSE
  BEGIN
    RETURN 0
  END
GO
Avatar billede soerens Nybegynder
09. maj 2001 - 12:03 #8
\"A default property was not found for the object\", er meldingen hvis man prøver ovenstående... Det ville næsten også være for nemt ;-)

En gammel kollega har nævnt at der vistnok findes en udokumenteret feature der skulle kunne bruges, som er beskrevet i en bog:

Davis Sussman\'s bog ADO 2.6 Programmeres Reference (WROX: ISBN: 186100463x - http://www.wrox.com/Books/Book_Details.asp?sub_section=1&isbn=186100463x&subject=ADO&subject_id=36)

Desværre er det IKKE en af dem der står på min reol, og jeg er ikke blevet desperat nok til at gå ud og købe den, hehe.

/SørenS
Avatar billede winkill Nybegynder
09. maj 2001 - 12:13 #9
Okay, du gør følgende.

Tag en ekstre lang jakke og et fake-mustage (med briller selvfølgeligt) på. Gå så ned i den nærmeste boghandel og lad som om du leder efter en bestemt bog imens du i \"Davis Sussman\'s bog ADO 2.6 Programmeres Reference\" bladrer dig frem til løsningen.
Hvis en af ekspedienterne fatter mistanke, så binder du ham/hende med dit fake-mustage og stikker af med den side fra bogen hvor løsningen står.

Hvis det ikke er 15 point værd, så ved jeg ikke hvad der er ;o)

En anden mulighed er selvfølgeligt at spørge din kollega hvordan man gør - hvis han ellers har bogen... men man skal jo ikke altid springe over hvor gæret er lavest, så jeg holder på at du forbereder dig på den første mulighed.

Damn jeg keder mig idag ;)
Avatar billede soerens Nybegynder
09. maj 2001 - 12:19 #10
ROFL!

Bare rolig, der skal nok falde point af ;-)

Venter lige til imorgen med at lukke ?, det ku\' jo være der var nogen derude der sad med GULD løsningen.

I mellemtiden vil jeg ud og lede efter et fake mustage....

/SørenS
Avatar billede ricardo Nybegynder
09. maj 2001 - 21:39 #11
>> det ku\' jo være der var nogen derude der sad med GULD løsningen.

Du skal blot lede efter nogen der går med deres testikler i en trillebør, pga vægten :)
Avatar billede winkill Nybegynder
10. maj 2001 - 08:24 #12
ROFLer rundt på gulvet og LOLer af grin...
Avatar billede soerens Nybegynder
15. maj 2001 - 10:48 #13
Nå, ingen fandt en OK løsning, så pointene går til winkill for den gode joke ;-)

/SørenS
Avatar billede winkill Nybegynder
15. maj 2001 - 10:53 #14
Takker, så er det da min første \"gode joke\" ever ;o)
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