Avatar billede ameq Nybegynder
06. september 2004 - 11:05 Der er 11 kommentarer og
1 løsning

Database Connecten

Hej
Jeg har lavet en cs fil som skulle åben en fonbindelse og når objekt så bliver sat til null skulle den lukke den igen, det virkede ellers til at starte med også med et laver den den her fejl.

Hvorfor?

Fejl:
Unhandled Exception: System.InvalidOperationException: Handle is not initialized
.
  at System.WeakReference.get_Target()
  at System.Data.Common.WeakReferenceCollection.Close(Boolean flag)
  at System.Data.OleDb.OleDbConnection.CloseReferences(Boolean canceling)
  at System.Data.OleDb.OleDbConnection.DisposeManaged()
  at System.Data.OleDb.OleDbConnection.Close()
  at Turnering.Db.Finalize()


Kode:
using System;
using System.Data.OleDb;

namespace Turnering
{
    /// <summary>
    /// Summary description for Open_Db.
    /// </summary>
    public class Db
    {
        private OleDbCommand objCommand;
        private OleDbConnection objConnection;

        public Db(string strSQL)
        {
            try
            {
                // Hvis det skal være en select skal du kalde på en .ExecuteReader()
                // Hvis det skal være en update, insert du kalde på en .ExecuteNonQuery()
           
                string strConnection = "user id=turnering;password=qwer1234;";
                strConnection += "initial catalog=turnering;data source=sqlserver; Provider=SQLOLEDB;";   
           
                objConnection = new OleDbConnection(strConnection);
                objCommand = new OleDbCommand(strSQL, objConnection);
                objConnection.Open();
            }
            catch
            {
                throw new Exception("Fejl i database forbindelsen (002)");
            }
           
        }
   
        public OleDbCommand cmd
        {
            get {return objCommand;}
        }

        ~Db()
        {
            objConnection.Close();
        }

    }
}
Avatar billede arne_v Ekspert
06. september 2004 - 11:11 #1
Jeg tror at der allerede er closet.

Enten laver eksplicit Close metode på din Db klasse og kalder den.

Eller så satser du på at OleDbConnections destructor gør det fornødne.

I begge tilfælde: slet den destructor
Avatar billede ameq Nybegynder
06. september 2004 - 11:15 #2
hm ja det har du ret i. Men bliver destructor kørt?
Avatar billede arne_v Ekspert
06. september 2004 - 11:19 #3
ja
Avatar billede ameq Nybegynder
06. september 2004 - 11:34 #4
hvorfor bliver den kører der og ikke når mit obj. bliver sat til null?
Avatar billede arne_v Ekspert
06. september 2004 - 11:39 #5
I C++ køres destructor med det samme når objektet enten delete's for et
dynamisk allokeret eller går ud af scope for et automatisk allokeret.

Men i C# bliver destructor/Finalize kaldt af garbage collectoren
"på et eller andet passende tidspunkt".
Avatar billede ameq Nybegynder
06. september 2004 - 12:30 #6
okey, men hvordan kan jeg så styrre det?
Avatar billede arne_v Ekspert
06. september 2004 - 12:34 #7
Du kan/skal ikke styre hvornår destructor/Finalize bliver kaldt.

Det nemmeste er at lave en eksplicit Close metode i din klasse og kalde
den når du vil lukke.
Avatar billede ameq Nybegynder
06. september 2004 - 12:39 #8
okey tak for det =), men kunne du svar på en anden ting hurtig er der en metode til at tælle antal rows man får tilbage i sådan en datareader?
Avatar billede arne_v Ekspert
06. september 2004 - 12:47 #9
Det mener jeg ikke.
Avatar billede arne_v Ekspert
06. september 2004 - 12:47 #10
OleDbDataReader.RecordsAffected Property

Property Value
The number of rows changed, inserted, or deleted; 0 if no rows were affected or the statement failed; and -1 for SELECT statements.
Avatar billede ameq Nybegynder
06. september 2004 - 12:50 #11
tak =) kommer du med et svar =)
Avatar billede arne_v Ekspert
06. september 2004 - 12:52 #12
svar
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