Avatar billede zeroaim Nybegynder
10. januar 2005 - 15:44 Der er 32 kommentarer og
1 løsning

SqlConnection.Open() fejl, kaster hvilken Exception ?

Hejsa.

Hvis jeg forsøger at åbne en forbindelse til en SQL DB med en forkert source string (ikke eksisterende server eller lignende), hvilken exception vil dette så kaste ???
Synes jeg har prøvet alt, men det kan selvfølgelig være jeg griber det helt forkert an.

Lidt kode:

string source = "server=(IKKE EKSISTERENDE SERVER) osv. osv."

SqlConnection conn = new SqlConnection(source);

try
{
    conn.Open();
    kode......
}
catch(??????????)
{
    kode......
}

Jeg formoder at den timerout ved at forsøge at kalde en ikke eksisterende server, men jeg kan som sagt ikke få den til at kaste en exception. Hvad gør jeg forkert ?

Henrik
Avatar billede neocron Nybegynder
10. januar 2005 - 15:58 #1
Jeg har kort forsøgt mig med noget lignende i Java.
Prøv at catch en SQLException.

catch(SQLException e)

Det er mit bedste bud.
Avatar billede neocron Nybegynder
10. januar 2005 - 16:01 #2
Her er et link til SQL og C# - det er godt nok MySQL, der tages udgangspunkt i.

http://csharp.codenewbie.com/articles/csharp/1433/MySQL_and_NET__Using_MySQLDriverCS-Page_1.html
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:04 #3
Jeg har prøvet med:

catch(System.Data.SqlClient.SqlException)

Men det virker ikke.

Jeg tjekker lige dit link ud.
Avatar billede neocron Nybegynder
10. januar 2005 - 16:05 #4
Det skal siges, for god ordens skyld, at jeg har ikke nogen relevant erfaring indenfor C# - det lignede bare temmelig meget noget, jeg prøvede i Java engang - og der kan man ihvertfald fange dem med SQLException :)
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:10 #5
Har også prøvet:

catch(Exception e)
{
kode....
}

Virker heller ikke.

Derfor jeg er i tvivl om SqlConnection.Open() overhovedet kaster en exception når den bliver kaldt med en source string til en server der ikke eksisterer.

Måske skal der bruges noget med SqlError i stedet, men jeg synes jo bare kun det kan bruges til at finde fejl/advarsler osv. der bliver returneret fra SQL serveren. Og da jeg jo ikke kommer i kontakt med serveren (da den kaldte server ikke eksisterer), så synes jeg jo ikke lige det kan være SqlError der skal bruges.
Avatar billede arne_v Ekspert
10. januar 2005 - 16:11 #6
Hvorfor gætte ? Det står jo klart og tydeligt i docs !

Citat:

Exceptions
Exception Type Condition
InvalidOperationException Cannot open a connection without specifying a data source or server.
or

The connection is already open.

SqlException A connection-level error occurred while opening the connection.
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:11 #7
Okay. Ja jeg kender så intet til Java :-), men det er meget muligt at det er det samme i C#. Jeg gør bare et eller andet forkert så.
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:13 #8
Arne... Det har du helt ret i, men det kaster den bare ikke når den får en korrekt source string, med som indeholder navnet på en ikke eksisterende server. (Eller det gør den ikke lige når jeg forsøger at få den til det :-( )
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:15 #9
Som jeg skrev tidligere, formoder jeg at den må timeout ved at forsøge at connecte til en ikke eksisterende server,,, eller hvad ???
Avatar billede arne_v Ekspert
10. januar 2005 - 16:21 #10
Medmindre der er fejl i docs, så er det de exceptiosn der kan kastes.

Hvad indeholder conn.State efter conn.Open() er kaldt uden success og
uden exception ?
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:26 #11
Ja det har jeg lidt svært ved at sige. App'en (en webservice) går bare ned og viser en "Siden kan ikke vises" side i browseren. Så derfor har jeg lidt svært ved at få yderligere oplysninger fra den.
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:34 #12
try
{
  conn.Open();
}               
catch(InvalidOperationException e)
{
  result= "InvalidOperationException" + e.Message.ToString();
}
catch(SqlException e)
{
  result = "SqlException" + e.Message.ToString();
}
catch(ArgumentException e)
{
  result = "ArgumentException" + e.Message.ToString();
}
catch(Exception e)
{
  result = "Exception" + e.Message.ToString();
}
finally
{
  conn.Close();
}
return result;

Lidt rodet, men conn.Open() kaster intet der bliver fanget her, når den bliver kaldt med en korrekt formateret source string, som indeholder en ikke eksisterende server
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:36 #13
string source = "server=(local)\\IKKE_EKSISTERENDE_SERVER;" +
            "integrated security=SSPI;" +
        "database=master;" +
        "Connect Timeout=20";
Avatar billede Syska Mester
10. januar 2005 - 16:38 #14
Hvorfor ikke starte med at skrive det er en webservice, altså rart at vide hvad der sker i den anden ende :-P

Men en helt anden ting, men burde sådan et spm ikke ligge i ASP.NET.... ved ikke helt.... er jo også en del af begge
Avatar billede zeroaim Nybegynder
10. januar 2005 - 16:41 #15
buzzzz.... Jo det burde jeg nok ha nævnt fra starten (my bad). Skal jeg copy/paste det over i en consol app eller noget andet ? Vil det give et andet resultat ?

Og hvad angår katagori for dette spørgsmål, så ved jeg ikke om jeg valgte rigtigt. Hvis ikke så skal der hermed lyde en undskyldning til admin :-)
Avatar billede arne_v Ekspert
10. januar 2005 - 16:44 #16
Der er lidt overlap mellem C# og ASP.NET og .NET kayegorierne - ikke noget
problem at vi tager den her efter min mening
Avatar billede arne_v Ekspert
10. januar 2005 - 16:45 #17
Men ja det kunne vær emeget interessant at køre den kode som comsole app evt. at
debugge den console app !
Avatar billede zeroaim Nybegynder
10. januar 2005 - 17:02 #18
:-D

Så prøvede jeg lige i en console app i stedet

Fejl:

An unhandled exception of type 'System.NullReferenceException' occurred in conn_Open_Exceptions2.exe

Additional information: Objektreferencen er ikke indstillet til en forekomst af et objekt.
Avatar billede zeroaim Nybegynder
10. januar 2005 - 17:15 #19
Hmmmm..
Avatar billede zeroaim Nybegynder
10. januar 2005 - 17:25 #20
Jeg fatter minus nu (noob)
Avatar billede zeroaim Nybegynder
10. januar 2005 - 17:33 #21
Okay... Nu kaster den en SqlException

Sql server findes ikke eller adgang blev nægtet.

Det var så slet ikke conn.Open() den gik ned på, men en SqlDataReader.

Jeg forstår bare ikke at:

try
{
    conn.Open();
    aReader = cmd.ExecuteReader();
        aReader.Read();
    result = aReader.GetString(0);
        osv. osv.

ikke kaster en SqlException i try sætningen først, og så en NullReferenceException i finally sætningen bagefter.
Avatar billede Syska Mester
10. januar 2005 - 17:35 #22
angående det med kategori, er det fordi jeg selv synes den burde ligge i både ASP.NET og C# altså et helt ny kategori her på eksperten, da der jo kommer flere og flere til ASP.NET. Folk kan jo også bruge J# og og VB# til asp.net
Avatar billede zeroaim Nybegynder
10. januar 2005 - 17:38 #23
Altså en NullReferenceException når jeg forsøger på at kalde aReader.Close() i finally blokken.

Hvorfor bliver SqlExceptionen ikke fanget først når den står i try sætningen ? Eller det gør den måske også, men da den er unhandlet, returnerer den bare den før den returnerer SqlExceptionen som er handlet i en catch blok ???
Avatar billede zeroaim Nybegynder
10. januar 2005 - 17:41 #24
Det har du for så vidt ret i buzzzz, meeeeeeen nu får vi bare ikke altid alting som vi gerne vil ha dem her i livet ;-)

Men man kan vel også sige, at så længe det allesammen er .NET sprog, så kan man jo ofte godt bruge et svar lavet i et andet sprog end det man selv lige skriver i. Så måske derfor de har valgt ikke at opdele ASP.NET i de forskellige sprog.
Avatar billede zeroaim Nybegynder
10. januar 2005 - 17:46 #25
Hvis du smider et svar Arne v, så får du pointene for at foreslå at jeg flyttede det over i en console app. Der lærte jeg lige noget meget nyttigt !!! BETYDELIGT nemmere at debugge en console app. (i hvert fald når man er noob ;-) )

I må gerne lige forklare mig det jeg spørger efter i mit indlæg kl. 17.38. Det forvirrer mig lidt.

Men ellers tak for hjælpen allesammen !!!

Med venlig hilsen Henrik
Avatar billede Syska Mester
10. januar 2005 - 18:00 #26
Du har nok ret, også bare noget jeg kom i tanke om...
Avatar billede Syska Mester
10. januar 2005 - 18:02 #27
zeroaim -> aReader.Dispose();
Avatar billede Syska Mester
10. januar 2005 - 18:02 #28
en reader er hverken åben eller lukket.... tror jeg nok, men arne kan sikkert rette mig hvis jeg tager fejl
Avatar billede Syska Mester
10. januar 2005 - 18:06 #29
hmmmm, nu tåger jeg....ved jeg sq ikke hvorfor den ikke virker, men vel noget med at den er out of scope i den final blok hvor du kalder den
Avatar billede arne_v Ekspert
10. januar 2005 - 18:45 #30
En reader skal closes.

Ellers får man fejl, hvis man forsøger at lave noget på samme connection !
Avatar billede arne_v Ekspert
10. januar 2005 - 18:48 #31
svar
Avatar billede arne_v Ekspert
10. januar 2005 - 18:50 #32
For at undgå sådan en null pointer exception efter den første exception bruger
man tit:

finally
{
  if(reader != null) reader.Close();
  if(connection != null) connection.Close();
}
Avatar billede zeroaim Nybegynder
10. januar 2005 - 21:05 #33
Hej igen.

Ja arne v, det var lige at teste på den inden jeg kaldte Close() jeg glemte. Det er rettet nu og alt virker som det skal. SÅdan er det at være noob, de fleste fejl jeg laver er sådan nogle tåbelige forglemmelser.... Men så glemmer jeg det forhåbentligt aldrig igen :-)

Der er lidt point til dig arne v. Og der er tak til jer andre :-)
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