/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Returnering af værdier fra Stored Procedur~
Fra : Jens Gyldenkærne Cla~


Dato : 05-09-02 15:44

Hjælp - nu har jeg brugt en halv dag på at bakse med min asp-kode,
men der er bare ikke hul igennem til databasen.

Jeg har ingen problemer med normale selects, og heller ikke med
simple lagrede procedurer (MS SQL-server 2000). Dem fyrer jeg af
med conn.execute "EXEC <spnavn> <var1>, <var2>, ..." og får et pænt
recordsæt retur. Men - nu skal jeg returnere data fra en større SP
der bygger et recordsæt op fra to TABLE-variable. Og det fungerer
bare ikke (alt virker selvfølgelig nydeligt i SQL-serveren).

Jeg prøver skiftevis med ovennævnte metode (conn.execute "EXEC...")
og følgende model

set cmd = server.CreateObject("adodb.command")
set cmd.ActiveConnection = conn
With cmd
   .CommandType = adCmdStoredProc
   .CommandText = "HentDokumenter2_sp"
   .CommandTimeOut = 600
End With
cmd.Parameters.Append cmd.CreateParameter("RetVal", _
               adInteger, adParamReturnValue)
cmd.Parameters.Append cmd.CreateParameter("@dokID", _        
              adInteger, adParamInput)
cmd.parameters("@dokID") = startDokID
      
set rsDok = Server.CreateObject("ADODB.Recordset")
rsDok.CursorLocation = adUseClient

rsDok.Open cmd
'    set rsDok = cmd.execute

Hverken med rsDok.Open cmd eller set rsDok = cmd.execute virker
det. Kan man ikke returnere data fra tablevariable?



--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

 
 
Mark S. Rasmussen (05-09-2002)
Kommentar
Fra : Mark S. Rasmussen


Dato : 05-09-02 17:05

> Hverken med rsDok.Open cmd eller set rsDok = cmd.execute virker
> det. Kan man ikke returnere data fra tablevariable?

Hvad sker der hvis du prøver at hente dem med en:

rs = Conn.Execute("sp_DinStoredProcedure 'variabel'")

?

Mvh Mark



Jens Gyldenkærne Cla~ (05-09-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 05-09-02 21:30

Mark S. Rasmussen skrev:

> Hvad sker der hvis du prøver at hente dem med en:
>
> rs = Conn.Execute("sp_DinStoredProcedure 'variabel'")

**
ADODB.Recordset error '800a0e78'

Operation is not allowed when the object is closed.

/selvbetjening/rediger.asp, line 148
**

Linje 148 er:

   While Not rsDok.EOF

Samme fejl kommer hvis jeg bruger

   rsDok.Open cmd

eller

   set rsDok = cmd.execute

Hvor cmd er en adodb.command.

--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Mark S. Rasmussen (05-09-2002)
Kommentar
Fra : Mark S. Rasmussen


Dato : 05-09-02 23:02

> ADODB.Recordset error '800a0e78'
>
> Operation is not allowed when the object is closed.
>
> /selvbetjening/rediger.asp, line 148
> **

Må jeg prøve at se din kode så?

Du dette ikke:

Dim rsDoc : Set rsDoc = Server.CreateObject("ADODB.RecordSet")
rsDoc.Open "sp_MinKommando 'minVariabel'", Conn, 1, 2

While NOT rsDoc.EOF AND NOT rsDoc.BOF
'blahblah
Wend

Mvh Mark
--
www.improve.dk



Jens Gyldenkærne Cla~ (06-09-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 06-09-02 09:12

Mark S. Rasmussen skrev:

> Må jeg prøve at se din kode så?

Ja da. Jeg har lagt hele det afsnit der fejler ud på
<http://www.dmamusic.dk/download/aspfejl.txt>.


> Du dette ikke:
>
> Dim rsDoc : Set rsDoc = Server.CreateObject("ADODB.RecordSet")
> rsDoc.Open "sp_MinKommando 'minVariabel'", Conn, 1, 2

Desværre - giver samme fejl (rsDok bliver ikke åbnet).

Jeg havde en formodning om at det var på grund af at sp'ens data
blev returneret fra en virtuel tabel at det ikke kom igennem - men
den er pillet ned igen. Selv om jeg lader sp'en skrive til en
temporær (fysisk) tabel og henter data herfra er problemet der
stadig. Problemet ligger ikke i SQL-serveren (der kommer skam data
i tempTabellen når websiden bliver kørt) - men i overførslen til
ADODB.recordsættet.

Postsættet indeholder i øvrigt 8 små felter - i datatyperne int,
tinyint, varchar og bit. Ikke noget der burde volde problemer så
vidt jeg kan se. Ligeledes er antallet af returnerede poster
begrænset - typisk mindre end 20.

Hvad er der galt....

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Lykkegaard (06-09-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 06-09-02 10:36

Som svar på skriblerier nedfældet af Jens Gyldenkærne Clausen :

> Mark S. Rasmussen skrev:
>
>> Må jeg prøve at se din kode så?
>
> Ja da. Jeg har lagt hele det afsnit der fejler ud på
> <http://www.dmamusic.dk/download/aspfejl.txt>.
>
Jeg er mere interesseret i din Stored Procedure
En sp kan snild returnere flere recordsets
Og kan snild bruges i Connection.Open eller Recordset.Open

Jeg ved ikke lige hvordan du bygger den op, men ado har en ide om _alle_
resultater skal resulterer i et recordset

Prøv evt at bruge SET NOCOUNT ON/OFF i starten og til slut i din SP

Et andet spørgsmål
Du siger TABLE variables...
Er det temp tables, eller?

Og endelig
Bruger du Output parametre eller Return values?

mvh/Peter Lykkegaard



Jens Gyldenkærne Cla~ (06-09-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 06-09-02 11:15

Peter Lykkegaard skrev:

Jeg skal først lige udbasunere at fejlen *er* fundet - mere herom
længere nede.

>> Ja da. Jeg har lagt hele det afsnit der fejler ud på
>> <http://www.dmamusic.dk/download/aspfejl.txt>.
>>
> Jeg er mere interesseret i din Stored Procedure

Den kan ses på
<http://www.dmamusic.dk/download/hentdokumenter2_sp.sql>.

> Prøv evt at bruge SET NOCOUNT ON/OFF i starten og til slut i
> din SP

Det var den ene ting der var galt. Jeg faldt over
<http://www.eksperten.dk/spm/242907> og tænkte at *nu* havde jeg
fundet løsningen. Men der var én ting mere der var galt: under
udviklingen af sp'en havde jeg brugt en PRINT-sætning til at tjekke
forløbet. Den stod stadig og genererede uddata - åbenbart nok til
at blokere asp-overførslen.


> Et andet spørgsmål
> Du siger TABLE variables...
> Er det temp tables, eller?

Nej - variable af typen TABLE. Ligger kun i hukommelsen, men
fungerer i øvrigt som en almindelig tabel.

> Bruger du Output parametre eller Return values?

Jeg returnerer et enkelt postsæt.


Det tog desværre lang tid før jeg fandt årsagen til de manglende
poster (jeg har brugt en masse krudt på at veksle mellem
forskellige måder at hente en sp på - noget der tilsyneladende ikke
gør nogen forskel her) - men nu er jeg da blevet lidt klogere.

Tak for hjælpen til jer der deltog her - og varme tanker til Benny
Tordrup der på eksperten.dk gjorde mig opmærksom på betydningen af
NOCOUNT.

--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Lykkegaard (06-09-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 06-09-02 11:54

Som svar på skriblerier nedfældet af Jens Gyldenkærne Clausen :

> Peter Lykkegaard skrev:
>
>> Prøv evt at bruge SET NOCOUNT ON/OFF i starten og til slut i
>> din SP
>
> Det var den ene ting der var galt.

Jeps, det driller når man fx laver update/inserts og select til sidst

> Men der var én ting mere der var galt: under
> udviklingen af sp'en havde jeg brugt en PRINT-sætning til at tjekke
> forløbet. Den stod stadig og genererede uddata - åbenbart nok til
> at blokere asp-overførslen.
>
Den har jeg også prøvet
Jeg mener at dit "print output" bliver returneret i det første recordset,
hvor du så kan findet rigtige ved at bruge metoden NextRecordset

mvh/Peter Lykkegaard



Jens Gyldenkærne Cla~ (06-09-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 06-09-02 12:06

Peter Lykkegaard skrev:

> Jeg mener at dit "print output" bliver returneret i det første
> recordset, hvor du så kan findet rigtige ved at bruge metoden
> NextRecordset

Det lyder sandsynligt. Jeg skulle have prøvet med NextRecordSet-
metoden (eller er der en antalRecordSet-egenskab man kan aflæse?).


--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Peter Lykkegaard (06-09-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 06-09-02 15:46

Som svar på skriblerier nedfældet af Jens Gyldenkærne Clausen :

> Peter Lykkegaard skrev:
>
>> Jeg mener at dit "print output" bliver returneret i det første
>> recordset, hvor du så kan findet rigtige ved at bruge metoden
>> NextRecordset
>
> Det lyder sandsynligt. Jeg skulle have prøvet med NextRecordSet-
> metoden (eller er der en antalRecordSet-egenskab man kan aflæse?).

Njahh, ikke direkte, der er en del gotchas
Prøv læse lidt om metoden i MSDN (ADO API Reference -> ADO Methods)

Det normale/almindelige scenario er at den returnere Nothing hvis der ikke
er mere at hente
NB! Der er ikke noget der hedder PreviousRecordset

mvh/Peter Lykkegaard



Søg
Reklame
Statistik
Spørgsmål : 177551
Tips : 31968
Nyheder : 719565
Indlæg : 6408838
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste