Sql forbindelse crash

Tags:    .net

Når jeg opretter forbindelse til min sql-server virker det fint. Men programmet er lavet sådan man selv kan indtaste servernavn, database, brugernavn og password.

Problemet er så at når servernavnet eller databasen ikke eksisterer crasher programmet:(
Hvordan kan jeg undgå det crash og istedet bare få en fejlbesked eller lign?

Her er forbindelsesdelen i koden:
Fold kodeboks ind/udKode 


Nogen hjælp??

EDIT: Programmet crasher ikke, men det fryser i cirka 20 sekunder(det er meget træls).





Indlæg senest redigeret d. 02.10.2008 08:54 af Bruger #10584
47 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
lav det i en try/catch blok og hvis du rammer din catch blok skal du vise en fejl

EDIT: grunden til at det tager så længe er at den venter på et timeout fra serveren.. det er svært at undgå



Indlæg senest redigeret d. 02.10.2008 09:09 af Bruger #2730
Jonas, hvorfor i alverden skulle en "try-catch" være resource krævende ?

Hvis jeg var dig ville jeg først lave et tjek på om databasen og brugeren rent faktisk
eksitere på SQL serveren. Hertil ville jeg bruge nok bruge den indbyggede SA bruger. Bare for at gøre det nemt.

Du kan f.eks prøve at kigge på sys.databases mulighederne (http://msdn.microsoft.com/en-us/library/ms178534.aspx).

Når du tester om en database findes kan du bruge en try catch finally blok.

'pseudo kode
Dim connect As New OleDb.OleDbConnection("Provider=SQLOLEDB;Data Source=DinServer;Initial Catalog=Master;User Id=sa;Password=xxx;")

Try
connect.Open()

'videre her, hvis der er ikke sker en fejl.
Catch ex As Exception
Response.Write ex.Message
Finally
If Not connect Is Nothing
connect.Close()
End If
End Try





Brug Connection.SetTimeOut eller ligennde...

Den er sikkert default 20 sec.

Personligt ville jeg lave et check om adressen éksisterede, og så bare beholde de 20 sec timout.

Try catch tager heldigvis ikke 20 sec :)

/J



Okay fint nok.

Jeg kunne godt forestille mig, at den Sql server du har med at gøre er en MS SQL Server 2000 og ikke en 2005... Men undersøg det alligevel...

Der kan være rigtig mange årsager til problemet når du har med databaser at gøre:
- Serveren (her mener jeg fx. Windows serveren) den kører på - hastighed, størrelse osv.
- Selve Sql serveren (brugerrettigheder (især!), indekseringen, den engine / version den kører (der er fx. meget stor forskel på MS Sql Server 2000 og 2005...))
- Forskellen mellem forbindelsen i mellem test og produktionsmiljø (der kan være meget store hastighedsforskelle mellem test- og produktions-miljø pga. båndbredde osv.)
- osv. osv. osv.

Hvis du siger det bliver lavet for et firma så sidder der måske en SA (server admin) der har givet dig nogle forskellige rettigheder på Sql serveren og det kan fx. være årsagen til performance-problemer.

Men prøv at overveje, som jeg har prøvet at skitsere for dig ovenfor, hvor mange forskellige fejlkilder der kan være ved lige netop dit problem... og det er uden at kende den eksakte situation som du sidder i.



Indlæg senest redigeret d. 19.10.2008 23:38 af Bruger #2243
Skrev det lidt forkert før :|
Det crasher hvis ip eller databasenavn er forkert og fryser i ca 20 sekunder hvis jeg bruger Try-catch :(

Programmet er til et større firma, så en fejl som den er ikke så go' :(



Problemet er, at en try-catch er enormt resource-krævende, men i dette tilfælde er den svær at undgå...



Dit eksempel virker desværre ikke Daniel, fryser stadig..

Er det muligt på en er anden måde at sætte en tidsbestemt begrænsning (timer event??), så den kun søger efter serveren i nogle få sekunder??



Jonas, hvorfor i alverden skulle en "try-catch" være resource krævende ?


Jeg har bare fået at vide og læst mig til, at kode i en try-catch blok tager længere tid at køre end hvis det ikke er wrappet i en try-catch...?

Der vil opstå en exception når der er indtastet en database der ikke eksisterer... Derfor skal du fange den exception med en try-catch for at programmet ikke crasher.

Der er en mulighed i LINQ to SQL til at se om en database eksisterer (jeg undskylder, men jeg kan ikke skrive det i VB :)):
Fold kodeboks ind/udCSharp kode 


Som Daniel skriver kan der jo også opstå fejl simpelthen fordi der fx. mangler rettigheder på den server man forsøger at lave en forbindelse til... Men koden ovenfor skulle kunne gøre tricket :) Du skal bare huske, at smide det hele i en try-catch som sagt.



Indlæg senest redigeret d. 06.10.2008 23:08 af Bruger #2243
Con.ConnectionTimeout.



Har lige testet både ConnectionTimeout og CommandTimeout, jeg kan godt ændre værdierne i dem, men jeg kan ikke se nogen ændring i ventetiden (som jeg fundet ud af ligger omkring 40 sek)
Forstår stadig ikke hvorfor tiden ikke ændre sig når jeg kan se jeg kan ændre værdierne (tjekker med fx msgbox(connect.ConnectionTimeout))

Er det noget som skal ændres i sqlserveren?



t