Avatar billede martinbk Nybegynder
05. oktober 2005 - 09:15 Der er 12 kommentarer og
2 løsninger

ADO.NET check database forbindelse

Hejsa

jeg sidder her og roder lidt med at lave en generel database klasse med ADO.net, jeg har dog et problem med en metode der skal tjekke om forbindelsen til databasen er intakt

public class DbHandler
    {
        private static string ip;
        private static string port;
        private static string iniCatalog;
        private static string userLogin;
        private static string userPassword;

        public DbHandler(string dbName, string login, string password, string ip, string port)
        {
            DbHandler.ip = ip;
            DbHandler.port = port;
            DbHandler.userLogin = login;
            DbHandler.userPassword = password;
            DbHandler.iniCatalog = dbName;
        }

        static SqlConnection NewConnection()
        {
            return new SqlConnection("workstation id="+ip+";packet size=4096;integrated security=SSPI;data source="+ip+";persist security info=True;initial catalog="+iniCatalog+"; user id="+userLogin+"; password="+ userPassword +";");
        }

        public static bool CheckConnection()
        {
            try
            {
                NewConnection().Open();
                return true;
            }
            catch (InvalidOperationException ioe)
            {
                return false;
            }
            catch (SqlException sqle)
            {
                return false;
            }
            finally
            {
                NewConnection().Close();
            }
        }
    }


problemet består i at metoden altid retunerer true, uanset om jeg stopper database serveren.

håber nogen kan se min bummert
Avatar billede arne_v Ekspert
05. oktober 2005 - 09:18 #1
hvorfor lukke en anden connection i finaly end den du har åbnet i try ??
Avatar billede kalp Novice
05. oktober 2005 - 09:18 #2
Du fortæller den jo ikke hvornår den skal returnere... true..

bare at den skal returnere true efter at du har kaldt

NewConnection().Open();
Avatar billede kalp Novice
05. oktober 2005 - 09:19 #3
Koden læses oppefra.. der er ingen exception.. derfor returnere den ikke false.. altså catch delen eksekveres ikke
Avatar billede arne_v Ekspert
05. oktober 2005 - 09:19 #4
har du givet serveren tid til at lukke ordentligt ned ?
Avatar billede martinbk Nybegynder
05. oktober 2005 - 09:38 #5
arne_v 09:18:16

efter hvad jeg har forstået arbejder ADO.NET med en connection pool, så ADO.NET skulle sørge for jeg får den samme reelle forbindelse til databasen, så længe jeg bruger den samme connection string

og som sædvanlig har du ret, metoden virker faktisk, bare windows der ikke havde termineret processen korrekt
Avatar billede bennytordrup Nybegynder
05. oktober 2005 - 10:05 #6
Det er korrekt, at der bruges connection pool, men udnyttelsen af poolen kræver, at connection rent faktisk er lukket for, at den kan tildeles igen. Du henter et nyt connection objekt til at lukke en connection.

Prøv følgende i stedet:

public static bool CheckConnection() {
  using (SqlConnection cnn = NewConnection()) {
    try {
      cnn.Open();
      return cnn.State == ConnectionStatus.Open;
    }
    finally {
      if (cnn.State == ConnectionStatus.Open)
        cnn.Close();
    }
  }
}
Avatar billede bennytordrup Nybegynder
05. oktober 2005 - 10:05 #7
Ovenstående vil sikre, at det er den samme fysiske instans af connection klassen, der bliver brugt til åbn og luk.
Avatar billede arne_v Ekspert
05. oktober 2005 - 10:06 #8
en connection pool består af et antal f.eks. 100 connections med samme connection string

når du closer leverer du connection tilbage til pool og en anden tråd kan få den
connection

men closer du ikke så er den ikke tilbage i poolen

og du kan ikke regne med at den når at GC'e mellem try og finally
Avatar billede martinbk Nybegynder
05. oktober 2005 - 11:01 #9
bennytordrup

mangler der ikke en catch blok på din metode ?

arne_v tak for uddybningen, lader lige spørgsmålet stå lidt enndu, mens jeg arbejder lidt videre.
Avatar billede bennytordrup Nybegynder
05. oktober 2005 - 11:03 #10
Det kan du putte på, hvis du har behov for at fange exception og håndtere den. Den er ikke nødvendig. Men enten catch eller finally skal være der.
Avatar billede martinbk Nybegynder
05. oktober 2005 - 11:09 #11
tja jeg må vel skulle have en catch blok der fanger den evt. SqlException Open() smider og sørger for der bliver retunreret ConnectionState.Closed (false)
Avatar billede bennytordrup Nybegynder
05. oktober 2005 - 11:12 #12
Du kan godt lave et catch, hvor du returnerer false.
Avatar billede martinbk Nybegynder
13. oktober 2005 - 09:01 #13
har langt om længe fundet svaret på mit spørgsmål

iflg. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdataconnectionstateclasstopic.asp

er "Broken" en endnu ikke implementeret værdi af State propertien på IDbConnection, da jeg hele tiden forsøger at teste om der er liv i min forbindelse kan jeg ikke bare teste på ConnectionState.Open, da denne altid vil være true så fremt der har været forbindelse, jeg antager dette sker fordi det vil kræve for mange rescourcer at konstant skulle undersøge om der er forbindelse til database serveren.

men hvis arne_v lige ligger et svar vil jeg fordele lidt point
Avatar billede arne_v Ekspert
13. oktober 2005 - 11:25 #14
ok
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