Avatar billede trenskow Nybegynder
03. januar 2005 - 23:22 Der er 3 kommentarer og
1 løsning

webservice og executereader

Hejsa allesammen

Jeg har et lille problem med en webservice som bruger en database.
Første gang jeg kører getListe virker det uden problemer, men anden gang får jeg denne fejl.
"System.InvalidOperationException: ExecuteReader requires an open and available Connection. The connection's current state is Closed."

Min kode i classen der håndterer database tilgangen ser sådan her ud.

using System;
using System.Data;
using System.Data.OleDb;

namespace fodboldService
{
    /// <summary>
    /// Summary description for AccesDB.
    /// </summary>
    public class AccesDB
    {
        //            public string connectionString = "Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source=\"" + System.Web.HttpContext.Current.Server.MapPath("fodbold.mdb") + "\";Jet OLEDB:Engine Type=5;Provider=\"Microsoft.Jet.OLEDB.4.0\";Jet OLEDB:System database=;Jet OLEDB:SFP=False;persist security info=False;Extended Properties=;Mode=Share Deny None;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1";
        public OleDbConnection dbconn = new OleDbConnection("Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source=\"" + System.Web.HttpContext.Current.Server.MapPath("fodbold.mdb") + "\";Jet OLEDB:Engine Type=5;Provider=\"Microsoft.Jet.OLEDB.4.0\";Jet OLEDB:System database=;Jet OLEDB:SFP=False;persist security info=False;Extended Properties=;Mode=Share Deny None;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1");
        private static OleDbCommand dbCmd;

        private void Open()
        {
            if(dbconn.State.ToString().CompareTo("Open")!=0)
                dbconn.Open();
        }

        public void Close()
        {
            dbconn.Close();
        }

        public OleDbCommand GetDbCommand(string sql)
        {
            if(dbconn.State.ToString().CompareTo("Open")!=0)
                Open();
            if (dbCmd == null)
            {
                dbCmd = new OleDbCommand("",dbconn);
            }
            dbCmd.CommandText = sql;
            return dbCmd;
        }
    }
}

og fejlen forekommer i denne linie
dbReader = dbCmd.ExecuteReader()
i denne klasse

using System;
using System.Collections;
using System.Data;
using System.Data.OleDb;

namespace fodboldService
{
    /// <summary>
    /// Summary description for KampeDB.
    /// Denne klasse står for interaktionen med tabellen kampe i databasen
    /// </summary>
    public class KampeDB
    {
        //Controller c;
        private static OleDbCommand dbCmd = null;
        private AccesDB adb = new AccesDB();
        public KampeDB()
        {
        }

        public void deleteAll()
        {
            // Skal slette alt indhold fra holdNavn
            string sql = "delete * from kampe";
            OleDbCommand cmd = adb.GetDbCommand(sql);
            cmd.ExecuteNonQuery();
            adb.Close();
        }

        public ArrayList getAll()
        {
            ArrayList alleKampe = new ArrayList();
            string sql = "SELECT kampe.RundeID, holdNavn.holdNavn, holdNavn_1.holdNavn, kampe.hjemmemaal, kampe.udemaal FROM (holdNavn INNER JOIN kampe ON holdNavn.holdId = kampe.hjemmehold) INNER JOIN holdNavn AS holdNavn_1 ON kampe.udehold = holdNavn_1.holdId;";
            dbCmd = adb.GetDbCommand(sql);
            IDataReader dbReader;
            dbReader = dbCmd.ExecuteReader();

            Kamp k;

            while(dbReader.Read())
            {
                k = new Kamp(int.Parse(dbReader["rundeid"].ToString()),dbReader["holdNavn.holdNavn"].ToString(),dbReader["holdNavn_1.holdNavn"].ToString(), int.Parse(dbReader["hjemmemaal"].ToString()), int.Parse(dbReader["udemaal"].ToString()));
                alleKampe.Add(k);
            }
            adb.Close();
            return alleKampe;
        }
        public ArrayList getAllFraEnRunde(int runde)
        {
            ArrayList alleKampe = new ArrayList();
            string sql = "SELECT kampe.RundeID, holdNavn.holdNavn, holdNavn_1.holdNavn, kampe.hjemmemaal, kampe.udemaal FROM (holdNavn INNER JOIN kampe ON holdNavn.holdId = kampe.hjemmehold) INNER JOIN holdNavn AS holdNavn_1 ON kampe.udehold = holdNavn_1.holdId where rundeid = " + runde + ";";
            dbCmd = adb.GetDbCommand(sql);
            IDataReader dbReader;
            dbReader = dbCmd.ExecuteReader();

            Kamp k;

            while(dbReader.Read())
            {
                k = new Kamp(int.Parse(dbReader["rundeid"].ToString()),dbReader["holdNavn.holdNavn"].ToString(),dbReader["holdNavn_1.holdNavn"].ToString(), int.Parse(dbReader["hjemmemaal"].ToString()), int.Parse(dbReader["udemaal"].ToString()));
                alleKampe.Add(k);
            }
            adb.Close();
            return alleKampe;
        }
    }
}

Nogen der kan se hvad jeg gør galt?
Avatar billede arne_v Ekspert
04. januar 2005 - 00:01 #1
Lidt speciel konstruktion. Jeg ville nok bare have lavet en ny connection, da .NET
har indbygget connection pool.

Men tilbage til dit problem. Det er lidt mystisk. Fordi connection burde blive lukket
op igen.

Et gæt - prøv at ændre:

private static OleDbCommand dbCmd = null;

til:

private OleDbCommand dbCmd = null;
Avatar billede arne_v Ekspert
04. januar 2005 - 00:02 #2
og

private static OleDbCommand dbCmd;

til

private OleDbCommand dbCmd;
Avatar billede trenskow Nybegynder
04. januar 2005 - 00:10 #3
jow for hundan, det virker.... point til dig, hvis du vil være venlig at smide et svar :-)
Avatar billede arne_v Ekspert
04. januar 2005 - 00:11 #4
kommer her
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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