Avatar billede mortency Nybegynder
22. november 2004 - 13:21 Der er 13 kommentarer og
2 løsninger

Hente ut SP fra MS SQL til asp side feiler

<%
Option Explicit

Server.ScriptTimeout = 1800

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

dim adoCn
dim strSQL
dim adoRs
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_HKL"
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
%>

Når jeg kjører dette scriptet kommer følgende feilmelding:
Error Type:
ADODB.Recordset (0x800A0E78)
Operation is not allowed when the object is closed.
/Project_Test/rapporter/rapport_1.asp, line 23

Når jeg kjører EXEC sp_aktive_HKL i Query Analyser så kommer dataene fram..... Underlig....

//Morten
Avatar billede hnteknik Novice
22. november 2004 - 15:35 #1
Prøv at kigge på dem her

adoRs.Close
Set adoRs = Nothing

adoCn.Close
Set adoCn = Nothing
Set adoCm = Nothing


Du arbejder på noget som har lukket
Avatar billede mortency Nybegynder
22. november 2004 - 15:44 #2
De blir jo lukket etter at spørringen blir kjørt!
Avatar billede hnteknik Novice
22. november 2004 - 16:33 #3
Det kan være, at du ikke må lukke
adoCn.Close

efter

adoRs.Close

Prøv at køre scriptet igennem uden at lukke noget af det.
Se om du så får nogen feil.
Jeg kan ikke kigge på det førend at jeg er hjem på min udvikler maskine.
Hvad type SP er det du kjører ?
Avatar billede hnteknik Novice
22. november 2004 - 17:53 #4
<%
//---- CommandTypeEnum Values ----
var db = "Provider=SQLOLEDB.1;Server=MEACULPA;database=solit4u;uid=hnteknik;pwd=nuller";
//var db  = "dsn=MeaculpaDB;uid=Henrik;"

var con = Server.CreateObject('ADODB.Connection');
var cmd = Server.CreateObject("ADODB.Command");

try
{
    con.Open(db);
    cmd.ActiveConnection = con;
    cmd.CommandText = "HentFejllog"
    cmd.CommandType = adCmdStoredProc
      // Ask the server about the parameters for the stored proc
    cmd.Parameters.Refresh
      // Assign a value to the 2nd parameter.
      // Index of 0 represents first parameter.
      //cmd.Parameters(1) = 11
    var rs = cmd.Execute
    //var rs = con.Execute("SELECT brugernavn, fulde_navn FROM  tblmedlem");
    if(!rs.BOF&&!rs.EOF)
    {Response.Write('<table border=1 cols=10 width="100%">');
        while(!rs.EOF)
        {         Response.Write("<tr>");
                        Response.Write("<TD bgcolor='#99B3CC' width='10%'>");
                        Response.Write(rs("brugernavn")+"");
                        Response.Write("</TD>");
                       
                        Response.Write("<TD bgcolor='#99B3CC' width='10%'>");
                        Response.Write(rs("fulde_navn")+"");
                        Response.Write("</TD>");                       
                Response.Write("</tr>");
            rs.moveNext();
        }
    Response.Write('</table">');
    }
}
catch (e)
{
    Response.Write(e.message);
}
finally
{
    // clean up
    if (rs.State == adStateOpen)
        rs.Close;
    if (con.State == adStateOpen)
        con.Close;
    rs = null;
    con = null;
}
%>
Hej med jer
</body>
</html>
Avatar billede hnteknik Novice
22. november 2004 - 17:57 #5
Ups den røg afsted uden tekst ved.
Det er et lokalt eks. på, hvordan man kalder via en cmd til SP.
det er i Jscript, men kan hurtigt oversættes til vbscript.
Avatar billede mortency Nybegynder
22. november 2004 - 19:03 #6
Hei!

Har ikke testet overstånede ennå....

SP`en ser slik ut:
if(object_id('tempdb.dbo.#temp')<>1)
    drop table #temp

SET dateformat dmy

Declare @datoFOM datetime
Declare @datoTOM datetime
Declare @avdeling varchar(50)

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

SELECT fkbravdeling, a.SiOppForsikringFra, b.dato as gjelderfra, a.Regnr
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,'01.01.2050')


select  * from
(
SELECT anavn,
sum(
case when month(SiOppForsikringFra) = month(GjelderFra) and year(SiOppForsikringFra) = year(GjelderFra)then
    DateDiff(d, GjelderFra, SiOppForsikringFra)
else
    DateDiff(d, GjelderFra,
dateadd(day, -0, '01' + datename(month, dateadd(month,1, gjelderFra)) + cast(year(dateadd(month,1, gjelderFra)) as varchar))
)
end
) as AntDays,
'Antall aktive denne mnd' as regnr, count(*) as AntCars,
year(GjelderFra) as [year], month(GjelderFra) as [month],
datename(month,gjelderFra) + ' ' +  cast(year(gjelderFra) as varchar) as dato,
  2 as [order]
FROM
#temp a join 
tblAvdeling
on  FKBRAvdeling=AID

--****************************************************************
-- Perioden spørringen skal kjøres på event avdeling med @avdeling
--****************************************************************

WHERE gjelderfra between @datoFOM and @datoTOM
group by anavn, month(GjelderFra), year(GjelderFra), datename(month,gjelderFra) + ' ' +  cast(year(gjelderFra) as varchar)
) a
union
(
SELECT anavn,
case when month(SiOppForsikringFra) = month(GjelderFra) and year(SiOppForsikringFra) = year(GjelderFra)then
    DateDiff(d, GjelderFra, SiOppForsikringFra)
else
    DateDiff(d, GjelderFra,
dateadd(day, -0, '01' + datename(month, dateadd(month,1, gjelderFra)) + cast(year(dateadd(month,1, gjelderFra)) as varchar))
)
end AntDays,

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

1 as [order]
FROM
#temp a join 
tblAvdeling b
on  FKBRAvdeling=AID

--****************************************************************
-- Perioden spørringen skal kjøres på event avdeling med @avdeling
--****************************************************************

WHERE gjelderfra between @datoFOM and @datoTOM
)

order by a.anavn, a.year, a.month, [order]
Avatar billede mortency Nybegynder
22. november 2004 - 19:04 #7
Har også prøvd å legge den direkte inn i spørringen i asp scriptet men får samme feilmelding da. Skjønner ikke dette?! .. hmmmmm Den virker jo fra Query Analyser...
Avatar billede hnteknik Novice
22. november 2004 - 19:39 #8
OK jeg har lagt den ind på min server og har blot ændret kladet til min SQL server og navnet på SP. Og det virker. Husk at 'Option Explicit' vil fejle, hvis det ikke står før HTML tekst på siden.

Noget tyder på, at det er i din SP problemet ligger. Hvad returnerer den, når den kaldes direkte fra serveren. Den returnerer et dataset ?

Tilsyneladende virker din kode uden
adoCm.CommandType = adCmdStoredProc
Avatar billede hnteknik Novice
22. november 2004 - 19:42 #9
Undskyld jeg sov lige i timen.

set adoCm = Server.CreateObject("ADODB.Command")
Avatar billede mortency Nybegynder
23. november 2004 - 09:58 #10
Det virker heller ikke.
Avatar billede mortency Nybegynder
23. november 2004 - 10:38 #11
//Hnteknik

Her er scriptet på databasen. Med alle data. Kjør det i query analyser

--LAGER TBLBILER
CREATE TABLE [tblBiler] (
    [BID] [int] IDENTITY (1, 1) NOT NULL ,
    [FKEier] [int] NOT NULL ,
    [RegNr] [varchar] (7) NOT NULL ,
    [FKFabrikat] [int] NOT NULL ,
    [FKModell] [int] NOT NULL ,
    [FKType] [int] NOT NULL ,
    [ArsModell] [varchar] (4) NOT NULL ,
    [Motorstorrelse] [varchar] (3) NOT NULL ,
    [Listepris] [int] NOT NULL ,
    [FKPremie] [int] NOT NULL ,
    [PeriodePremie] [decimal](18, 0) NOT NULL ,
    [FKBRAvdeling] [int] NOT NULL ,
    [OpprettetDato] [datetime] NOT NULL ,
    [FKRegAv] [int] NOT NULL ,
    [GjelderFra] [datetime] NOT NULL ,
    [Aktiv] [varchar] (3) NOT NULL ,
    [SlettetAV] [int] NULL ,
    [SlettetDato] [datetime] NULL ,
    [SiOppForsikringFra] [datetime] NULL ,
    [EndretAV] [int] NULL ,
    [EndretDato] [datetime] NULL
) ON [PRIMARY]
GO

--LAGER TBLAVDELING
CREATE TABLE [tblAvdeling] (
    [AID] [int] IDENTITY (1, 1) NOT NULL ,
    [ANavn] [varchar] (50) NOT NULL ,
    [AAktiv] [varchar] (3) NULL
) ON [PRIMARY]
GO

--LEGGER INN AVDELINGER
INSERT [tblAvdeling] ([ANavn], [AAktiv]) VALUES ('Avdeling A', 'JA')
INSERT [tblAvdeling] ([ANavn], [AAktiv]) VALUES ('Avdeling B', 'JA')
INSERT [tblAvdeling] ([ANavn], [AAktiv]) VALUES ('Avdeling C', 'JA')
INSERT [tblAvdeling] ([ANavn], [AAktiv]) VALUES ('Avdeling D', 'JA')
INSERT [tblAvdeling] ([ANavn], [AAktiv]) VALUES ('Avdeling E', 'JA')
GO

--LEGGER INN BILER I TBLBILER
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36221', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 1, '01.01.2003 19:57:55', 33, '01.01.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36222', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 1, '01.01.2004 19:57:55', 33, '02.05.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36223', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 1, '01.01.2004 19:57:55', 33, '03.05.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36224', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 1, '01.01.2004 19:57:55', 33, '04.04.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36225', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 1, '01.01.2004 19:57:55', 33, '05.05.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36226', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 1, '01.01.2004 19:57:55', 33, '06.06.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36227', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 1, '01.01.2004 19:57:55', 33, '07.07.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36228', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 1, '01.01.2004 19:57:55', 33, '08.08.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36229', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 2, '01.01.2004 19:57:55', 33, '09.09.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36210', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 3, '01.01.2004 19:57:55', 33, '10.10.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36211', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 4, '01.01.2004 19:57:55', 33, '11.11.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
INSERT [tblBiler] ([FKEier], [RegNr], [FKFabrikat], [FKModell], [FKType], [ArsModell], [Motorstorrelse], [Listepris], [FKPremie], [PeriodePremie], [FKBRAvdeling], [OpprettetDato], [FKRegAv], [GjelderFra], [Aktiv], [SlettetAV], [SlettetDato], [SiOppForsikringFra], [EndretAV], [EndretDato]) VALUES (27, 'RJ36212', 29, 284, 1, '2004', '2,0', 330000, 1, 1561, 5, '01.01.2004 19:57:55', 33, '12.12.2003 00:00:00', 'JA', NULL, NULL, NULL, NULL, NULL)
GO

--LAGER SP`EN
CREATE PROCEDURE sp_aktive_HKL

AS

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

SET dateformat dmy

Declare @datoFOM datetime
Declare @datoTOM datetime

Set @datoFOM = '01.01.2003'
Set @datoTOM = '31.12.2003'

SELECT fkbravdeling, a.SiOppForsikringFra, b.dato as gjelderfra, a.Regnr
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,'01.01.2050')


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

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

1 as [order]
FROM
#temp a join 
tblAvdeling b
on  FKBRAvdeling=AID
-- Perioden spørringen skal kjøres på
WHERE gjelderfra between @datoFOM and @datoTOM
)

order by a.anavn, a.year, a.month, [order]
GO
Avatar billede mortency Nybegynder
23. november 2004 - 10:40 #12
//Hnteknik

Du kan så kjøre SP_aktive_HKL(query ananlyser) du vil da se at den henter data......

ASP SCRIPTET MITT SER SLIK UT:
<%
Server.ScriptTimeout = 1800

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

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

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

set adoRs = adoCn.Execute("SP_aktive_HKL")   
       
Do While Not adoRs.EOF
    Response.Write("<hr>" & adoRs(2) & "<br>")'adoRs(2) henter nr 2 fra query.
adoRs.MoveNext
Loop

adoRs.Close
Set adoRs = Nothing

adoCn.Close
Set adoCn = Nothing
%>
Avatar billede mortency Nybegynder
24. november 2004 - 10:16 #13
Her er løsningen http://support.microsoft.com/kb/q235340/

CAUSE
The SQL Server OLEDB provider (SQLOLEDB) has a new behavior designed to provide more accurate information to the caller about what happened in the procedure. Each SQL statement within a stored procedure returns a "result," either a count of rows affected, or a resultset.

The SQL Server ODBC provider (MSDASQL) does not provide information about the results of individual SQL statements within a stored procedure. The only result that comes back from a stored procedure execution is the result of the SELECT statement if it has one. This is why the problem does not manifest with MSDASQL.
RESOLUTION
To get SQLOLEDB to behave as the SQL ODBC driver did, you must use SET NOCOUNT ON. Put SET NOCOUNT ON in the stored procedure or in the SQL statement used with ADO as shown in the code sample below. Alternatively, you could use MSDASQL.
Avatar billede hnteknik Novice
24. november 2004 - 21:01 #14
Hi Morten - just returned fra udlandet nærmere Jylland og har først set din response nu. Godt du fandt ud af det selv.

BTW arbejder du for Vesta ?
Tak for points.

Henrik
Avatar billede mortency Nybegynder
06. januar 2005 - 15:50 #15
Nei, gjør ikke det.
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