Toon posts:

[SQL Server2000] SP output parameter EN recordset*

Pagina: 1
Acties:

Verwijderd

Topicstarter
hoe kan ik middels een stored procedure een waarde retourneren? Nu heb ik dit als storedprocedure:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE PROCEDURE cv.sp_get_subtypes
(
    @typeid int,
    @typename varchar(30) OUTPUT
)
AS
    SELECT @typename     = [Name] 
    FROM             refType 
    WHERE ID         = @typeid

    SELECT * FROM   refSubType
    WHERE [TypeID]  = @typeid
GO

Ik roep de storedprocedure op de volgende manier aan in een ASP-pagina:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Call openDb

oCm.CommandText      = "cv.sp_get_subtypes"
oCm.CommandType  = adCmdStoredProc

oCm.Parameters.Append oCm.CreateParameter("@typeid", adInteger, adParamInput, Len(Request.Form("typeid")), Request.Form("typeid"))
oCm.Parameters.Append oCm.CreateParameter("@typename", adVarChar, adParamOutput, 30)

oRs.Open oCm.Execute

sType = oCm.Parameters("@typename")

Response.Write "You've selected <b>" & sType & "</b> as a global field of expertise.<br/><br/>" & vbCRLF
Response.Write "<form name=""create_2"" method=""post"" action=""" & Request.ServerVariables("SCRIPT_NAME") & "?m=create_cv&i=2"" onsubmit=""return validateCreate_2(this);"">" & vbCRLF
Response.Write "<input type=""hidden"" name=""employeeid"" value=""" & Request.Form("employeeid") & """/>" & vbCRLF
Response.Write "<table>" & vbCRLF
Response.Write "<tr>" & vbCRLF
Response.Write "<td class=""formexplanation"">Global field of expertise: </td>" & vbCRLF
Response.Write "<td><select name=""subtypeid"" size=""1"" class=""listbox""><option value="""">Please select an area for type " &  sType & "</option>"

If Not oRs.EOF Then
    Do Until oRs.EOF
        Response.Write "<option value=""" & oRs("ID") & """>" & Trim(oRs("Name")) & "</option>" & vbCRLF
        oRs.MoveNext
    Loop
End If                  

Call closeDb

openDb en closeDb zijn zelfgeschreven subroutines die de databaseconnectie opzetten en weer afsluiten.

Wanneer ik de ASP-pagina uitvoer blijkt mijn sType variabele leeg, de recordset heeft wel de juiste waarden gekregen.

edit: Het gaat om SQL2000 server.

Verwijderd

Op dinsdag 18 juni 2002 08:43 schreef I-eye het volgende:
hoe kan ik middels een stored procedure een waarde retourneren? Nu heb ik dit als storedprocedure:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE PROCEDURE cv.sp_get_subtypes
(
    @typeid int,
    @typename varchar(30) OUTPUT
)
AS
    SELECT @typename     = [Name] 
    FROM             refType 
    WHERE ID         = @typeid

    SELECT * FROM   refSubType
    WHERE [TypeID]  = @typeid
GO
Dit zou gewoon moeten werken, IMHO. De 2e select zorgt er wel voor dat de 1e resultset wordt verwijderd, maar je stopt een waarde in een parameter, dus zou goed moeten gaan.

Probeer dit eens of dit wel werkt:
[code]
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE PROCEDURE cv.sp_get_subtypes
(
    @typeid int,
    @typename varchar(30) OUTPUT
)
AS
DECLARE @sTmp varchar(30)

    SELECT @sTmp     = [Name] 
    FROM             refType 
    WHERE ID         = @typeid

SET @typename = @sTmp

    SELECT * FROM   refSubType
    WHERE [TypeID]  = @typeid
GO

Btw: het is _NIET_ verstandig 'myname.' prefixes voor stored procedures te plaatsen! Creeer stored procedures, tables en andere objects ALTIJD met prefix 'dbo.'. Zodoende kan IEDERE user de objects executeren/gebruiken plus krijg je niet per user een recompile van de stored proc.

Verder is het niet verstandig 'sp_' prefixes te plaatsen voor je storedprocedure naam, want SQLServer denkt dan dat het een system stored proc is, gaat kijken in 'master', en daarna prefixed met de huidige user en daarna pas in je huidige database. gebruik bv 'pr_' als prefix.

Verwijderd

Topicstarter
Ik heb het geprobeerd en ik krijg helaas hetzelfde resultaat.

Ik zal je andere suggesties meenemen in een overleg betreffende de standaarden die we alhier bij de klant moeten hanteren. Thnx.

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Er staat me iets bij dat de volgorde van ophalen van de recordset of de output parameter van invloed is (heb alleen geen tijd om het te testen/op te zoeken).
Probeer eens eerst de recordset op te halen (rs.getRows bijvoorbeeld), deze te sluiten en daarna pas je output param uit te lezen.

Today's subliminal thought is:


Verwijderd

Topicstarter
ik heb dit gedaan, is dat wat je bedoelt?
code:
1
2
3
4
5
6
oRs.Open oCm.Execute
oRs.Close
                    
sType = oCm.Parameters("@typename")

Response.Write sType

Het resulteert in een lege pagina, variabele is niet gevuld.

Verwijderd

Topicstarter
en gevonden. Annie heeft me op het goede spoor gezet:
code:
1
2
3
oCm.Execute
sType = oCm.Parameters("@typename")
oRs.Open oCm.Execute

vult wel de variabele en vult ook mijn recordset.

Verwijderd

ah! :P Ik had daar helemaal niet naar gekeken, ik ging er gemakshalve van uit dat je de connection open hield tot na de read van die params hehe :) ik vond het al raar dat het niet werkte.

Connection objects sluiten zorgt ervoor dat ADO alle objects die dat object gebruikt hebben voor data-retrieval ook sluit/opruimt.
Pagina: 1