Avatar billede mortency Nybegynder
11. oktober 2004 - 12:48 Der er 21 kommentarer og
2 løsninger

Finner ikke data i recordsetet

Jeg har en sql spørring som jeg har testet i query analyser. Når jeg kjører den samme spørringen fra asp script så får jeg følgende feilmelding:

Item cannot be found in the collection corresponding to the requested name or ordinal

Hva skyldes dette? Den finner ingen av dataene?

SP`en ser slik ut på MS SQL SERVER:

CREATE PROCEDURE sp_aktive

AS

if(object_id('tempdb.dbo.#temp')<>1)
drop table #temp

SET dateformat dmy

Declare @datoFOM datetime
Declare @datoTOM datetime

Set @datoFOM = '01.12.2003'
Set @datoTOM = '31.12.2003'

SELECT fkbravdeling, a.SiOppForsikringFra, b.dato, a.Regnr, bid, gjelderfra, aktiv
into #temp
FROM
tblbiler a
join
(select distinct cast('01' + datename(month, gjelderFra) + cast(year( gjelderFra) as varchar) as datetime) as dato from tblbiler) b
on  b.dato between gjelderFra  and coalesce(SiOppForsikringFra,'01jan2050')
-- Mulig dette går raskere? Da jeg kun skal sammenligne en verdi.
-- on  b.dato between gjelderFra  and IsNull(SiOppForsikringFra,'01jan2050')

select  * from
(
SELECT anavn,SiOppForsikringFra, aktiv, gjelderFra,
sum(
case when month(SiOppForsikringFra) = month(dato) and year(SiOppForsikringFra) = year(dato)then
    DateDiff(d, dato, SiOppForsikringFra)
else
    DateDiff(d, dato,
dateadd(day, -1, '01' + datename(month, dateadd(month,1, dato)) + cast(year(dateadd(month,1, dato)) as varchar))
)
end
) as AntDays,
'Antall aktive denne mnd' as regnr, count(*) as AntCars,
year(dato) as [year], month(dato) as [month],
datename(month,dato) + ' ' +  cast(year(dato) as varchar) as dato,
  2 as [order]
FROM
#temp a join
tblAvdeling
on  FKBRAvdeling=AID
-- Perioden spørringen skal kjøres på
WHERE dato between @datoFOM and @datoTOM
-- kjører på avdeling
--WHERE fkbravdeling = 182
group by anavn,SiOppForsikringFra, aktiv, gjelderFra,  month(dato), year(dato), datename(month,dato) + ' ' +  cast(year(dato) as varchar)
) a
union
(
SELECT anavn,SiOppForsikringFra, aktiv, gjelderFra,
case when month(SiOppForsikringFra) = month(dato) and year(SiOppForsikringFra) = year(dato)then
    DateDiff(d, dato, SiOppForsikringFra)
else
    DateDiff(d, dato,
dateadd(day, -1, '01' + datename(month, dateadd(month,1, dato)) + cast(year(dateadd(month,1, dato)) as varchar))
)
end AntDays,

Regnr, 1 as AntCars ,year(dato) as [year], month(dato) as [month],
datename(month,dato) + ' ' + cast(year(dato) as varchar)  as dato,

1 as [order]
FROM
#temp a join 
tblAvdeling b
on  FKBRAvdeling=AID
-- Perioden spørringen skal kjøres på
WHERE dato between @datoFOM and @datoTOM
-- kjører på avdeling
--WHERE fkbravdeling = 182
)
order by a.anavn, a.year, a.month, [order]

if(object_id('tempdb.dbo.#temp')<>1)
drop table #temp
GO

//Morten
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 13:41 #1
Den siger at du prøver at hent en kolonne som ikke findes:
Response.Write (Rec("findesIkke"))

- ville give denne fejl

Dit recordset er sikkert ikke tomt

For at finde fejlen skal jeg se ASP'en, men prøv ørst at bruge AS i din select;
De kolonner som du er nødt til at angive med table.colname, skal du give et specifikt navn med AS fx:

SELECT a.SiOppForsikringFra AS aSiOppForsikringFra FROM ...
Avatar billede mortency Nybegynder
11. oktober 2004 - 14:03 #2
strSQL = "sp_aktive"
set adoRs = adoCn.Execute(strSQL)

Do While Not adoRs.EOF
    Response.Write(adoRs("a.anavn") & "<br>")
adoRs.MoveNext
Loop

adoRs.Close
Set adoRs = Nothing

adoCn.Close
Set adoCn = Nothing
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 14:20 #3
Ja, der er den!

adoRs("a.anavn") - du kan ikke bruge . i kolonnenavne

Så du kan ENTEN prøve
adoRs("anavn")

ELLER gøre som jeg sagde før, bruge AS til at angive et nyt navn
Avatar billede mortency Nybegynder
11. oktober 2004 - 14:24 #4
Mener du først kjøre sp_aktive så i sp legge inn

SELECT a.SiOppForsikringFra AS aSiOppForsikringFra FROM #temp ???
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 14:28 #5
Nej. Det er åbenbart a.anavn der giver problemet, så du skal ændre din SP så du, på det sted du SELECT'er anavn, bruger AS ...

Jeg kan ikke helt overskue din sp, jeg plejer ikke at lave det sådan, med case og sådan ...
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 14:29 #6
SELECT a.SiOppForsikringFra AS aSiOppForsikringFra FROM ..

Det var bare et eksempel, OK?
Avatar billede mortency Nybegynder
11. oktober 2004 - 14:42 #7
men alle feltene kommer frem i QA når jeg kjører den. Hvorfor kan ikke feltene hentes i asp scriptet?
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 14:49 #8
i QA ser du kun den del af navnet der kommer efter punktummet, men asp (eller rettere ADO) ser det hele.

Du vil faktisk kunne hente data i asp ved at bruge index i stedet for kolonnenavn:

Response.Write(adoRs(0))

- bare som eksempel. kolonnerne har nummer 0, 1, 2 og så videre.
Avatar billede mortency Nybegynder
11. oktober 2004 - 15:12 #9
Dette virker ikke heller???? :-)

strSQL = "sp_aktive"
set adoRs = adoCn.Execute(strSQL)

Do While Not adoRs.EOF
    Response.Write(adoRs(0) & "<br>")
adoRs.MoveNext
Loop


adoRs.Close
Set adoRs = Nothing

adoCn.Close
Set adoCn = Nothing

I ASP, så kan du bare kjøre hele SQL'en. Den har en vanlig select som spytter ut en tabell. DU kan også hente den fra stored procedure som du kaller fra asp ved ExecuteQuery på.
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 15:20 #10
Med den kode ber du om at få første kolonne udskrevet. Gir den stadig fejlen:

Item cannot be found in the collection corresponding to the requested name or ordinal

??

Hvis du skriver

EXEC sp_aktive

i query analyzer, returnerer den så data?
Avatar billede mortency Nybegynder
11. oktober 2004 - 15:24 #11
Hvis jeg kjører EXEC sp_aktive i QA så kommer alle data`ene frem.... Skjønner ingen ting......
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 15:42 #12
Gir den stadig fejlen:

Item cannot be found in the collection corresponding to the requested name or ordinal

- selv om du bruger adoRs(0)? Er du sikker på at fejlen kommer på det sted? adoRs(0) skulle ikke kunne give fejl, med mindre BOF eller EOF er true
Avatar billede mortency Nybegynder
11. oktober 2004 - 15:50 #13
<%
Option Explicit

Server.ScriptTimeout = 1800
%>
<!--#include file ="include/global_variables.asp"-->
<%
dim strConn
strConn = "Provider=SQLOLEDB;Initial Catalog=; Server=server-idesign;User ID=;Password="

dim adoCn
dim strSQL
set adoCn = Server.CreateObject("ADODB.Connection")
adoCn.Open strConn

set adoRs = Server.CreateObject("ADODB.Recordset")

strSQL = "sp_aktive"

set adoRs = adoCn.Execute(strSQL)

Do While Not adoRs.EOF
    Response.Write(adoRs(0) & "<br>")
adoRs.MoveNext
Loop

adoRs.Close
Set adoRs = Nothing

adoCn.Close
Set adoCn = Nothing
%>

Da får jeg:
ADODB.Recordset (0x800A0E78)
Operation is not allowed when the object is closed.
/Project/admin_rapport_aktive_dager2.asp, line 22
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 16:15 #14
Drop linien
set adoRs = Server.CreateObject("ADODB.Recordset")
Avatar billede mortency Nybegynder
11. oktober 2004 - 16:17 #15
Fortsatt feil...
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 16:28 #16
drop også
adoRs.Close


eller brug den udvidede syntaks herunder:

<%
Option Explicit

Server.ScriptTimeout = 1800
%>
<!--#include file ="include/global_variables.asp"-->
<%
dim strConn
strConn = "Provider=SQLOLEDB;Initial Catalog=; Server=server-idesign;User ID=;Password="

dim adoCn
dim strSQL
set adoCn = Server.CreateObject("ADODB.Connection")
adoCn.Open strConn

set adoCm = Server.CreateObject("ADODB.Command")
adoCm.ActiveConnection = adoCn
set adoRs = Server.CreateObject("ADODB.Recordset")

strSQL = "sp_aktive"
adoCm.CommandText = strSQL
adoRs.Open adoCm, , 0, 1

Do While Not adoRs.EOF
    Response.Write(adoRs(0) & "<br>")
adoRs.MoveNext
Loop

adoRs.Close
Set adoRs = Nothing

adoCn.Close
Set adoCn = Nothing
Set adoCm = Nothing
%>
Avatar billede mortency Nybegynder
11. oktober 2004 - 16:34 #17
Error Type:
ADODB.Recordset (0x800A0E78)
Operation is not allowed when the object is closed.
/Project/admin_rapport_aktive_dager2.asp, line 26
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 16:45 #18
Ok, nu må jeg lige sikre mig at fejlen ikke opstår i global_variables.asp. Kan den undgås?

Linienummeret kan man jo ikke regne helt med, men vis mig lige den kode du bruger nu
Avatar billede mortency Nybegynder
11. oktober 2004 - 17:03 #19
<%
Server.ScriptTimeout = 1800

dim strConn,adocm
strConn = "Provider=SQLOLEDB;Initial Catalog=; Server=;User ID=;Password="

dim adoCn
dim strSQL
set adoCn = Server.CreateObject("ADODB.Connection")
adoCn.Open strConn

set adoCm = Server.CreateObject("ADODB.Command")
adoCm.ActiveConnection = adoCn
set adoRs = Server.CreateObject("ADODB.Recordset")

strSQL = "sp_aktive"
adoCm.CommandText = strSQL
adoRs.Open adoCm, , 0, 1

Do While Not adoRs.EOF
    Response.Write(adoRs(0) & "<br>")
adoRs.MoveNext
Loop

adoRs.Close
Set adoRs = Nothing

adoCn.Close
Set adoCn = Nothing
Set adoCm = Nothing
%>
Avatar billede ldanielsen Nybegynder
11. oktober 2004 - 17:16 #20
1. Bank din computer tre til fire gange hårdt ned i gulvet.
2. Drik evt. en kold øl
3. Begynd at dyrke skiløb, klatring eller en anden udendørs aktivitet, detteher er sgu FRUSTRERENDE.

- Nej, jeg ved ikke hvad jeg skal finde på mere ... :o)
Avatar billede mortency Nybegynder
06. januar 2005 - 15:46 #21
Måtte bare lage en annen connection. Post et svar så får du noen point som takk for hjelpen.
Avatar billede ldanielsen Nybegynder
06. januar 2005 - 17:00 #22
Det var længe siden!

Går det godt med skiløbet?  c",)
Avatar billede ldanielsen Nybegynder
03. oktober 2005 - 21:57 #23
Tak
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