Hoi,
Ik ben onderhand bezig database functies in stored procedures te gieten om zodoende ff wat meer performance te genereren. Erg leuk allemaal, alleen loop ik nu tegen een enigzins vreemd probleem aan. Als ik een recordset ophaal met een stored procedure welke gewoon een select uitvoert is er nix aan de hand, krijg ik een keurige recordset.
Als ik echter een belangrijke procedure in ASP ophaal krijg ik geen recordset terug maar een vaag object waarvan ik niet weet wat het is. Geen array, recordset of iets dergelijks in ieder geval. Terwijl de stored procedure in ISQLW gewoon keurig de records teruggeeft die ik wil hebben!
Wat dus wel werkt is het volgende:
CREATE PROC getAllCats
AS
SELECT cat.catID, cat.catName, cs.cseRenderer AS renderer, cat.catParentID , cat.catCseID
FROM Categories cat
JOIN categoryStyles cs
ON cs.cseID=cat.catCseID
WHERE cat.catDisplay=1
ORDER BY cat.catOrdID
GO
En in VBscript haal ik op de volgende manier de recordset in een array op:
Dim objConn, objRst, objCmd, rs, tmp
Set objConn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
ObjConn.OpenConnstr
objConn.getAllCats RS
tmp=RS.Getrows
ObjConn.Close
Set ObjConn=Nothing
Set RS=Nothing
Erg gezellig. Maar de volgende stored procedure geeft dus (deze is ff groter) geeft in ISQLW keurig terug wat ik moet hebben, maar niet als ik hem binnen VBscript ophaal:
CREATE PROCEDURE test
@soort int
,@idint
,@pageint
,@sizeint
AS
BEGIN
DECLARE @Full int, @List int, @force int, @uselist int
If @soort = 1
BEGIN
SET @uselist = 1
Declare getlist cursor for
SELECT catImsIDFull, catIMSIDList, catForceItemStyle FROM Categories, items WHERE catID=itmCatID AND itmID= @id for read only
END
Else
BEGIN
SET @uselist = 0
Declare getlist cursor for
SELECT catImsIDFull, catImsIDList, catForceItemStyle f FROM Categories WHERE catID=@id For read only
END
OPEN getlist
fetch next from getlist into @full, @list, @force
Close getlist
deallocate getlist
CREATE TABLE #TEMP_ITEMTABLE
(
Row int IDENTITY(1,1) PRIMARY KEY,
itmID int,
itmImsIdFullint,
itmImsIdListint,
ItmUseListbit,
ItmObjectIDint,
typeint
)
IF @soort=1
BEGIN
INSERT INTO #TEMP_ITEMTABLE ( itmID, itmImsIDFull, ItmImsIDList, ItmUseList, ItmObjectID, type)
SELECT itmID, itmImsIDFull, itmImsIDList, itmUseList, itmObjectID, itmObjectTypeID
FROM items
WHERE items.itmcatID = @ID AND items.itmUnapprovedVersionOf IS NULL AND (items.itmDatePubStart <= CURRENT_TIMESTAMP OR items.itmDatePubStart IS NULL) AND (items.itmDatePubEnd >= CURRENT_TIMESTAMP OR items.itmDatePubEnd IS NULL) AND items.itmDisplay=1 ORDER BY itmOrdID
END
ELSE
BEGIN
INSERT INTO #TEMP_ITEMTABLE ( itmID, itmImsIDFull, ItmImsIDList, ItmUseList, ItmObjectID, type)
SELECT itmID, itmImsIDFull, itmImsIDList, itmUseList, itmObjectID, itmObjectTypeID
FROM items
WHERE items.itmID = @ID AND items.itmUnapprovedVersionOf IS NULL AND (items.itmDatePubStart <= CURRENT_TIMESTAMP OR items.itmDatePubStart IS NULL) AND (items.itmDatePubEnd >= CURRENT_TIMESTAMP OR items.itmDatePubEnd IS NULL) AND items.itmDisplay=1 ORDER BY itmOrdID
END
SELECT * FROM #TEMP_ITEMTABLE
END
GO
De data hiervan haal ik met VBscript op de volgende manier binnen:
Dim objConn, objRst, objCmd, tmp, RS
Set objConn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
ObjConn.OpenConnstr
objConn.test 8,1,1,5, RS
tmp=RS.Getrows
ObjConn.Close
Set ObjConn= Nothing
Set RS= Nothing
De volgende foutmelding is het gevolg:
ADODB.Recordset error '800a0e78'
Operation is not allowed when the object is closed.
De fout wijst naar de regel waar ik de RS.GetRows uitvoer...geen idee waarom. Op een of andere manier krijg ik in plaats van een recordset een ander object terug.
Erg interessant, maar wat kan ik daar mee??
Weet iemand hoe ik gewoon braaf een recordset terug kan krijgen?
Ik ben onderhand bezig database functies in stored procedures te gieten om zodoende ff wat meer performance te genereren. Erg leuk allemaal, alleen loop ik nu tegen een enigzins vreemd probleem aan. Als ik een recordset ophaal met een stored procedure welke gewoon een select uitvoert is er nix aan de hand, krijg ik een keurige recordset.
Als ik echter een belangrijke procedure in ASP ophaal krijg ik geen recordset terug maar een vaag object waarvan ik niet weet wat het is. Geen array, recordset of iets dergelijks in ieder geval. Terwijl de stored procedure in ISQLW gewoon keurig de records teruggeeft die ik wil hebben!
Wat dus wel werkt is het volgende:
CREATE PROC getAllCats
AS
SELECT cat.catID, cat.catName, cs.cseRenderer AS renderer, cat.catParentID , cat.catCseID
FROM Categories cat
JOIN categoryStyles cs
ON cs.cseID=cat.catCseID
WHERE cat.catDisplay=1
ORDER BY cat.catOrdID
GO
En in VBscript haal ik op de volgende manier de recordset in een array op:
Dim objConn, objRst, objCmd, rs, tmp
Set objConn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
ObjConn.OpenConnstr
objConn.getAllCats RS
tmp=RS.Getrows
ObjConn.Close
Set ObjConn=Nothing
Set RS=Nothing
Erg gezellig. Maar de volgende stored procedure geeft dus (deze is ff groter) geeft in ISQLW keurig terug wat ik moet hebben, maar niet als ik hem binnen VBscript ophaal:
CREATE PROCEDURE test
@soort int
,@idint
,@pageint
,@sizeint
AS
BEGIN
DECLARE @Full int, @List int, @force int, @uselist int
If @soort = 1
BEGIN
SET @uselist = 1
Declare getlist cursor for
SELECT catImsIDFull, catIMSIDList, catForceItemStyle FROM Categories, items WHERE catID=itmCatID AND itmID= @id for read only
END
Else
BEGIN
SET @uselist = 0
Declare getlist cursor for
SELECT catImsIDFull, catImsIDList, catForceItemStyle f FROM Categories WHERE catID=@id For read only
END
OPEN getlist
fetch next from getlist into @full, @list, @force
Close getlist
deallocate getlist
CREATE TABLE #TEMP_ITEMTABLE
(
Row int IDENTITY(1,1) PRIMARY KEY,
itmID int,
itmImsIdFullint,
itmImsIdListint,
ItmUseListbit,
ItmObjectIDint,
typeint
)
IF @soort=1
BEGIN
INSERT INTO #TEMP_ITEMTABLE ( itmID, itmImsIDFull, ItmImsIDList, ItmUseList, ItmObjectID, type)
SELECT itmID, itmImsIDFull, itmImsIDList, itmUseList, itmObjectID, itmObjectTypeID
FROM items
WHERE items.itmcatID = @ID AND items.itmUnapprovedVersionOf IS NULL AND (items.itmDatePubStart <= CURRENT_TIMESTAMP OR items.itmDatePubStart IS NULL) AND (items.itmDatePubEnd >= CURRENT_TIMESTAMP OR items.itmDatePubEnd IS NULL) AND items.itmDisplay=1 ORDER BY itmOrdID
END
ELSE
BEGIN
INSERT INTO #TEMP_ITEMTABLE ( itmID, itmImsIDFull, ItmImsIDList, ItmUseList, ItmObjectID, type)
SELECT itmID, itmImsIDFull, itmImsIDList, itmUseList, itmObjectID, itmObjectTypeID
FROM items
WHERE items.itmID = @ID AND items.itmUnapprovedVersionOf IS NULL AND (items.itmDatePubStart <= CURRENT_TIMESTAMP OR items.itmDatePubStart IS NULL) AND (items.itmDatePubEnd >= CURRENT_TIMESTAMP OR items.itmDatePubEnd IS NULL) AND items.itmDisplay=1 ORDER BY itmOrdID
END
SELECT * FROM #TEMP_ITEMTABLE
END
GO
De data hiervan haal ik met VBscript op de volgende manier binnen:
Dim objConn, objRst, objCmd, tmp, RS
Set objConn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
ObjConn.OpenConnstr
objConn.test 8,1,1,5, RS
tmp=RS.Getrows
ObjConn.Close
Set ObjConn= Nothing
Set RS= Nothing
De volgende foutmelding is het gevolg:
ADODB.Recordset error '800a0e78'
Operation is not allowed when the object is closed.
De fout wijst naar de regel waar ik de RS.GetRows uitvoer...geen idee waarom. Op een of andere manier krijg ik in plaats van een recordset een ander object terug.
Erg interessant, maar wat kan ik daar mee??
Weet iemand hoe ik gewoon braaf een recordset terug kan krijgen?
The revenge of the mutant signature of doom is upon us!