Avatar billede madssch Nybegynder
06. november 2006 - 21:12 Der er 17 kommentarer og
1 løsning

Kalde Stored Procedure fra ASP

Hej Eksperter,

Jeg har følgende Stored Procedure i min MSSQL datbase:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

ALTER PROC [dbo].[stpGetPageHierarchy]
(
    @Root int
)
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @PageID int, @PageTitle varchar(30)

    SET @PageTitle = (SELECT PageTitle FROM dbo.viewPage WHERE PageID = @Root)

    PRINT REPLICATE('-', (@@NESTLEVEL * 4) - 4) + @PageTitle

    SET @PageID = (SELECT MIN(PageID) FROM dbo.viewPage WHERE PageRefID = @Root)

    WHILE @PageID IS NOT NULL
    BEGIN
        EXEC dbo.stpGetPageHierarchy @PageID
        SET @PageID = (SELECT MIN(PageID) FROM dbo.viewPage WHERE PageRefID = @Root AND PageID > @PageID)
    END
END

I selve databasen kalder jeg STP'en med:

EXEC dbo.ShowHierarchy 1
GO

Men hvordan gør jeg fra en ASP side?  Jeg vil gerne have STP'ens resultat returneret i en ASP variabel.

På forhånd tak!
Avatar billede hiks Nybegynder
06. november 2006 - 21:14 #1
hej

det er jo en sql ligesom alt muligt andet så

lidt ala denne hvis du benytter connections på denne måde

sql = "EXEC ShowHierarchy 1;"
set rs = conn.execute(sql)


/hiks
Avatar billede madssch Nybegynder
06. november 2006 - 21:18 #2
Altså, f.eks.:

sql = "EXEC ShowHierarchy 1;"
set rs = objConnect.execute(sql)

Do until rs.eof

' Hvad skriver jeg her?

rs.movenext
loop
Avatar billede hiks Nybegynder
06. november 2006 - 21:28 #3
ja eksempelvis

hvad returnerer den normalvis?

response.write rs("pageTitle") osv osv. som dine attributter nu engang hedder.

/hiks
Avatar billede madssch Nybegynder
06. november 2006 - 21:32 #4
Udsnit af returnering:

Forside
----TV Oversigt
----Programmer
----Nyheder
----Magasiner
--------Magasin #1
------------Tips & tricks
----------------Tip #1
----------------Tip #2

Prøver dette:

Set rs = objConnect.Execute("EXEC stpGetPageHierarchy 1")

    Do until rs.eof
   
        Response.Write rs("PageID")
   
    rs.movenext
    loop
   
Set rs = Nothing

Men får fejlen "Operation is not allowed when the object is closed." på linjen med "Do until..."
Avatar billede madssch Nybegynder
06. november 2006 - 21:33 #5
(Har omdøbt STP'en til "stpGetPageHierarchy")
Avatar billede hiks Nybegynder
06. november 2006 - 21:37 #6
prøv med objConnect.Open istedet.

/hiks
Avatar billede madssch Nybegynder
06. november 2006 - 22:07 #7
Så får jeg fejlen "Operation is not allowed when the object is open"  :)
Avatar billede madssch Nybegynder
06. november 2006 - 22:13 #8
Kan den ikke køre med:

Set objConnect = Server.CreateObject("ADODB.Connection")

?
Avatar billede madssch Nybegynder
06. november 2006 - 22:35 #9
Kan det være, at STP'en ikke returnerer et RecordSet - og at det i så fald er tomt?
Avatar billede arne_v Ekspert
07. november 2006 - 03:16 #10
et eksempel som virker hos mig:

<%
adCmdStoredProc = 4
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=SQLOLEDB;Data Source=ARNEPC3;Initial Catalog=Test;Integrated Security=SSPI;"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "usp_test"
Set rs = cmd.Execute
Do While Not rs.EOF
    Response.Write rs("F1") & " " & rs("F2") & "<br>"
    rs.MoveNext
Loop
Set rs = Nothing
Set cmd = Nothing
Set con = Nothing
%>
Avatar billede madssch Nybegynder
07. november 2006 - 09:03 #11
Okay:

Set cmd = Server.CreateObject("ADODB.Command")

    cmd.ActiveConnection = objConnect
    cmd.CommandType = 4
    cmd.CommandText = "stpGetPageHierarchy 1"

    Set rs = cmd.Execute
   
        Do While Not rs.EOF
           
            Response.Write rs("PageTitle") & "<br>"
           
            rs.MoveNext
           
        Loop
   
    Set rs = Nothing

Set cmd = Nothing

Giver følgende fejl:

"Syntax error or access violation" på linjen med "Set rs = cmd.Execute"

Hvis man kigger på STP'en i indlæg #1 - hvad er det så præcis jeg kan hive ud? PageID? PageTitle? (Skal gerne bruge begge, men det er en anden ting).

Kan ikke huske om jeg har sagt det, men har ikke selv lavet STP'en, men blot tilrettet den. Er meget grøn i STP's.
Avatar billede madssch Nybegynder
07. november 2006 - 14:46 #12
Ikke flere bud?
Avatar billede madssch Nybegynder
07. november 2006 - 15:04 #13
arne_v > Dit bud giver mig denne fejlbesked:

"Illegal assignment: 'adCmdStoredProc'" på denne linje "Set rs = cmd.Execute"
Avatar billede madssch Nybegynder
07. november 2006 - 15:20 #14
Hmmm... Nu er jeg så langt:

Har indsat denne linje i STP'en:

SELECT PageID, PageRefID, PageTitle, PagePriority FROM tblPage WHERE pageID = @RootID

Nu kan jeg så lave denne:

Set RS = objConnect.Execute("EXEC stpGetPageHierarchy @RootID = 1")

    Do until RS.EOF
   
        Response.Write RS("PageTitle") & "<br />"
       
        RS.MoveNext
       
    Loop
   
Set RS = Nothing

Problemet er nu, at den kun returnerer første række i Recordsettet. I Query Analyzer returnerer den alle p.t. 32.

Hvorfor?
Avatar billede hiks Nybegynder
07. november 2006 - 22:26 #15
sidder og overvejer om du bør have denne her i din stored procedure eller ej.

SET NOCOUNT ON

men umiddelbart skal du have den på vil jeg sige.

gider du prøve at lade den stå i toppen og så helt i bunden af din Stored procedure sætte

SET NOCOUNT OFF

ind?

evt. hvis det ovenstående ikke virker prøve at lave en cmd.Prepared = True på din ado connection.

/hiks
Avatar billede madssch Nybegynder
09. november 2006 - 08:57 #16
Den kan jeg sagtens prøve, men jeg har som sagt ikke brug for at løbe igennem et Recordset. Jeg ville gerne have én stor klump tekst tilbage fra SP'en til min ASP-side.

Jeg har oprettet en tråd under Databaser > MSSQL i håb om, at nogen kan hjælpe med at omskrive funktionen.

Indtil videre skal I begge have tak.

hiks > vil du smide et svar for første korrekte bud. Jeg fik det godt nok ikke til at virke, men jeg lærte da hvordan man gjorde.  :)
Avatar billede hiks Nybegynder
09. november 2006 - 09:36 #17
et meget lille svar kommer her... :)

/hiks
Avatar billede madssch Nybegynder
09. november 2006 - 09:46 #18
Tak for hjælpen anyway.
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