[ASP + MS-SQL] Return values sproc

Pagina: 1
Acties:

  • Wezzie
  • Registratie: Maart 2001
  • Laatst online: 21-08 07:00
Helden,

Ik zit met een bizar probleem. Ik heb het idee dat ik iets simpels verkeerd doe. Ik wil een insert doen op een Ms-Sql database. Het @@INDENTY wil ik terug geven aan de website voor een session variabele.

Ik heb dus de volgende sproc:
****************************************************
CREATE PROCEDURE [Insert_Session]
@ARTCODE AS ArtikelCode
AS
BEGIN
BEGIN TRAN MAIN_INSERT_SESSION
DECLARE @SESSIONID INT
INSERT INTO T_WINKELWAGENSESSIONS (ARTCOD)
VALUES (@ARTCODE)
SELECT @SESSIONID = @@IDENTITY
COMMIT TRAN MAIN_INSERT_SESSION
SELECT @SESSIONID AS SESSIONID
END
****************************************************

Wanneer ik echter de recordset die ik net gebruikt wil openen om te lezen krijg ik een fout meldind dat het object gesloten is. Ik heb de sproc al uitgebprobeerd in de SQL Query Analyser.

De code in asp is als volgt:
Dim sArtikelNummer, strQuery, ObjRS
sArtikelNummer = request.QueryString("ArtikelNummer")
iSessionId = Session(iSessionId)
if len(iSessionId) = 0 then
'Indien het een nieuwe sessie is maak dan een Id aan'
strQuery = "INSERT_SESSION" + "'&sArtikelNummer&'"
Set objRS= Server.CreateObject("ADODB.Recordset")
objRS.Open strQuery, objConn, 3, 3
if objRS.EOF then
objRS.Close
objConn.Close
Set objConn = Nothing
%>
<!-- #INCLUDE file="../include/error.asp" -->
<%
end if
Response.Write(objRS("ARTIKELCOD"))
end if

  • Wezzie
  • Registratie: Maart 2001
  • Laatst online: 21-08 07:00
Oja voor de volledigheid, de fout die ik krijg

Error Type:
ADODB.Recordset (0x800A0E78)
Operation is not allowed when the object is closed.
/WebShop/winkelwagentje.asp, line 18


Regel 18 is de volgende:
18: if objRS.EOF then

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
Tja, als je een foutmelding krijgt dat je recordset gesloten is, dan is hij waarshcijnlijk gesloten....
Als je recordset gesloten is kun je er ook geen waardes meer uithalen en kijk eens goed naar uw code....
code:
1
2
rsBla.Close
Response.Write(rsBla("veld"))

:?
Debuggen is ook een onderdeel van programmeren hoor...

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
Hmmm. ik heropen hem toch nog ff.

Maar anyway, debug even.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:02

gorgi_19

Kruimeltjes zijn weer op :9

Je code is lichtelijk een bende (no offence), waardoor het lastig is om wat te vinden.

Bijvoorbeeld dit stuk:
code:
1
2
3
4
5
6
7
8
9
10
if objRS.EOF then
objRS.Close
objConn.Close
Set objConn = Nothing
%>
<!-- #INCLUDE file="../include/error.asp" -->
<%
end if
Response.Write(objRS("ARTIKELCOD"))
end if

Is beter te hetschrijven als:
code:
1
2
3
4
5
6
7
8
9
10
if objRS.EOF then
%>
    <!-- #INCLUDE file="../include/error.asp" -->
<%
Else
    Response.Write(objRS("ARTIKELCOD"))
end if
objRS.Close
objConn.Close
Set objConn = Nothing

Daarnaast moet je je query maar eens met een Response.Write weergeven; ik denk dat je VBScript gebruikt en daar wordt meestal het & teken gebruikt i.p.v. +

En heb je je SP al uitgeprobeerd in b.v. Access of je daar een goede waarde voor krijgt weergegeven?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 20:22
<ot>
Wat gorgi_19 zegt is wel waar.
Jouw code is niet echt leesbaar te noemen. Kijk eens in de P&W FAQ, er is daar een heel stuk gewijd aan netjes en overzichtelijk coderen. Misschien dat je daar een paar idee-en kunt opdoen.
</ot>

https://fgheysels.github.io/


  • tijn
  • Registratie: Februari 2000
  • Laatst online: 31-07 00:06
Dit is weer het befaamde probleem met de 2 recordsets (waar je er 1 zou verwachten). De eerste recordset bevat '1 row(s) affected' en daar kun je niks mee doen. De 2e recordset bevat je identity value.
De oplossing is om even 'SET NOCOUNT ON' in je SP op te nemen waardoor die 'row(s) affected' message wegblijft en je gewoon 1 recordset terugkrijgt met je identity value

Cuyahoga .NET website framework


Verwijderd

Include files bovenaan, en anders server.execute gebruiken. Maar dat terzijde

Je closed je connectie maar roept wel je recordset aan! Is dat niet het probleem. En op welke regel geeft ie een foutmelding?

edit:

Dat is dus niet het probleem, dit is echt niet te lezen, dat je er zelf ook nog uitkomt. Netjes werken.. |:(

  • Wezzie
  • Registratie: Maart 2001
  • Laatst online: 21-08 07:00
Ik ben er al uit. Maar bedankt je moet namelijk een andere connectie met de server openen om een sproc uit te voeren.
even voor de volledigheid, dit is de code.

sArtikelNummer = request.QueryString("ArtikelNummer")
'Maak een nieuwe server connectie
Set SpecObjRS = Server.CreateObject("ADODB.Command")
'Zet deze in afwijking op ActiveConnection
SpecObjRS.ActiveConnection = "Provider=SQLOLEDB;SERVER=mailserver;UID=******;PWD=*****;Database=****"
'Noem de sproc
SpecObjRS.CommandText = "INSERT_SESSION"
'Zeg dat het een sproc is
SpecObjRS.CommandType = 4
'Defineer de return value
SpecObjRS.Parameters.Append SpecObjRS.CreateParameter("RETURN_VALUE", 3, 4, 4)
'Defineer de input parameters
SpecObjRS.Parameters.Append SpecObjRS.CreateParameter("@ARTCODE", 200, 1, 20, sArtikelNummer)
'Voor uit
Set adoRS = SpecObjRS.Execute
'Skip naar Parameters
Set adoRS = adoRS.NextRecordset
'Maak de sessie aan met het nieuwe ID'
iSessionId = SpecObjRS.Parameters("RETURN_VALUE")
Session("iSessionId") = SpecObjRS.Parameters("RETURN_VALUE")
set adoRs = nothing
set SpecObjRS.Activeconnection = nothing
set SpecObjRS =nothing
strLokation = "AddWinkelwagenRegel.asp?ArtikelNummer=" + sArtikelNummer
Response.Redirect(strLokation)

[ Voor 10% gewijzigd door Wezzie op 12-06-2004 13:01 . Reden: foutje ]

Pagina: 1