2010-04-08 16 views
8

Aby sprawdzić, czy mogę połączyć się z bazą danych, mogę wykonać następujący kod:test połączenia SQL bez rzuca wyjątek

using (SqlConnection connection = new SqlConnection(myConnectionString)) 
{ 
    try 
    { 
     connection.Open(); 
     canConnect = true; 
    } 
    catch (SqlException) { } 
} 

Działa to z wyjątkiem zgłasza wyjątek, jeśli połączenie nie powiodło się. Czy istnieje inny sposób testowania połączenia Sql, który nie rzuca wyjątku?

Edit: Aby dodać precyzji, pytam czy istnieje prosta metoda, która robi to bez konieczności otwierania połączenie i złapać wyjątki, które mogą wystąpić

+0

Dlaczego chcesz uniknąć wyjątku? – CResults

Odpowiedz

12

Podczas próby otwarcia połączenia nie można uniknąć wyjątku, jeśli nie można otworzyć połączenia. Może być ukryty gdzieś w funkcji, ale dostaniesz wyjątek, bez względu na wszystko.

Został zaprojektowany w ten sposób, ponieważ zazwyczaj oczekuje się, że będzie można połączyć się z bazą danych. Nieudane połączenie to wyjątek.

Mimo to można przetestować stan połączenia w stanie, sprawdzając właściwość State.

2

napisać rozszerzenie tak:

public static class Extension{ 
public static bool CanOpen(this SqlConnection connection){ 
    try{ 
    if(connection == null){ return false; } 

    connection.Open(); 
    var canOpen = connection.State == ConnectionState.Open; 
    connection.close(); 
    return canOpen; 
} 
catch{ 
    return false; 
} 
} 

Następnie można konsumować to lubią:

using(var connection = new SqlConnection(myConnectionString)){ 
     if(connection.CanOpen()){ 
     // NOTE: The connection is not open at this point... 
     // You can either open it here or not close it in the extension method... 
     // I prefer opening the connection explicitly here... 
    } 
} 

HTH.

+0

Dobra odpowiedź, ale koleś, rzucasz wyjątek – CResults

+0

@CResults: nie ma ROROW w bloku catch metody rozszerzenia, skutecznie jedzącej ten wyjątek. Wolę, aby ten wyjątek został zgłoszony, ale OP oświadczył, że nie chce generować wyjątku podczas sprawdzania, czy połączenie może zostać otwarte, stąd moje rozwiązanie. – Sunny

+0

Dbaj o to rozwiązanie, _SqlConnection.Open() _ pobiera połączenie z puli, jeśli jest dostępne łączenie. Następnie _State_ będzie _Open_, nawet jeśli połączenie jest uszkodzone (np. Kanał TCP). A następnie wyjątek zostanie podniesiony tylko podczas wykonywania polecenia. Rozwiązaniem jest użycie _Connection.ChangeDatabase (Connection.Database); _ aby sprawdzić, czy połączenie jest dostępne. – JoeBilly

3

Jeśli zgłasza wyjątek i załatwiasz go w swoim bloku catch, wiesz, że połączenie nie powiodło się. Myślę, że odpowiedziałeś na własne pytanie.

0

Myślę, że prawdziwą odpowiedzią tutaj jest ping.

string data = "ismyserverpingable"; 
byte[] buffer = Encoding.ASCII.GetBytes (data); 
int timeout = 120; 
PingReply reply = pingSender.Send ("google.com", timeout, buffer, options); 
if (reply.Status == IPStatus.Success) 
{ 
} 

Dopóki wyraźnie nie sprawdzasz, czy połączenie sql jest możliwe 9/10 powinieneś wiedzieć, czy coś jest serwerem sql. Pozwoli to zaoszczędzić ci tego nieprzyjemnego użycia pamięci wyjątku, na który obstawiam, naprawdę jest po.

+0

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx – Arian

0

Zawsze można użyć klasy ConnectionStringBuilder i sprawdzić istnienie każdego elementu, który jest wymagany przez ciąg połączenia przed próbą otwarcia.

Jeśli ciąg połączenia jest poprawny, ale serwer bazy danych, z którym się łączysz, jest wyłączony, nadal masz zamiar uzyskać wyjątek. Nie ma sensu sprawdzać jakości napisu, jeśli punkt końcowy, z którym się łączysz, może być offline.

0

Nie można uniknąć wyjątku przychodzącego podczas łączenia bazy danych, ale mają jakąś funkcję, która radzi sobie z tym bardzo dobrze. Używam tej funkcji, która zwraca wartość true, jeśli istnieje połączenie.

public static bool IsSQLConnectionAvailable() 
    { 
     SqlConnection _objConn = new SqlConnection(); 

     try 
     { 
      _objConn.ConnectionString = ConfigurationManager.ConnectionStrings["DefaultSQLConnectionString"].ConnectionString; 
      _objConn.Open(); 
     } 
     catch 
     { 
      return false; 
     } 
     finally 
     { 
      if (_objConn.State == ConnectionState.Open) 
       _objConn.Close(); 
     } 

     return true; 
    } 
Powiązane problemy