2009-05-16 12 views
5

Zastanawiam się, czy istnieje elegancki sposób sprawdzenia istnienia DB? W skrócie, w jaki sposób przetestować połączenie ciągu połączenia db?Jak sprawdzić istnienie DB?

Dzięki

Odpowiedz

17

Set Initial Catalog=master w ciągu połączenia i wykonaj:

select count(*) from sysdatabases where name = @name 

z @name zestaw do nazwy bazy danych.

Jeśli chcesz sprawdzić ciąg połączenia jako całość (i nie istnieje niezależna baza danych), spróbuj połączyć się z nim w bloku try/catch.

+0

To powinno być prawidłowa odpowiedź ... – bryanmac

+0

jak mogę wiedzieć powyżej zwrotów zapytania? – revolutionkpi

1

Po prostu spróbuj DBConnection.Open() owinięte w blok try blokujący DBException.

O eleganckim rozwiązaniu, które znajdziesz.

4

Możesz po prostu spróbować połączyć się z tym. Jeśli zgłasza wyjątek, ciąg połączenia jest w pewien sposób zły, baza danych nie istnieje, hasło jest nieprawidłowe lub coś innego.

DbConnection db = new SqlConnection(connection_string); 
try 
{ 
    db.Open(); 
} 
catch (SqlException e) 
{ 
    // Cannot connect to database 
} 
+1

To prawda, może się to nie udać z wielu powodów, takich jak nieprawidłowy format, wyłączony użytkownik, nieprawidłowe hasło i tak dalej. – cletus

+0

Znaleźliśmy tę metodę niewiarygodną, ​​fwiw. Odłączono stację roboczą od sieci, a kod nadal zgłosił otwarte połączenie. Podejrzewam, że jest to dziwactwo łączenia połączeń. – peacedog

3

Aby pokryć zakres możliwości (serwer nie istnieje w bazie nie istnieje, bez logowania, bez uprawnienia, serwer w dół, etc) - najprostszy pomysł jest po prostu spróbować połączyć się jako normalne, i wykonaj coś trywialnego - na przykład SELECT GETDATE(). Jeśli pojawi się wyjątek, pojawia się problem!

Są chwile (szczególnie w przypadku systemów pozaprocesowych), gdy najbardziej pragmatyczną opcją jest try/catch.

+0

Ktokolwiek to zajął - jest to tania szansa (chyba, że ​​jest coś, co zrobiłem głupio?). Jest to to samo, co przyjęta odpowiedź, udzielona w tym samym przedziale czasowym. Masz litość. –

+0

W celu sprawdzenia statusu "stanu sieci" (co jest naprawdę "można zapisać dane do bazy danych") stwierdziliśmy, że konieczne jest wykonanie polecenia, a nie tylko otwarcie połączenia. – peacedog

+0

@peacedog stąd SELECT GETDATE() –

1

spróbować

IF NOT EXISTS(SELECT * FROM sys.databases WHERE [name] = @name) 
    CREATE DATABASE @name; 
GO 

lub

IF db_id(@name) IS NOT NULL 
    CREATE DATABASE @name; 
GO 

lub SqlConnection.ChangeDatabase(String). Myślę, że może użyć mniej zasobów serwera SQL, a następnie nową próbę połączenia.

0

Jeśli używasz Entity Framework lub mają one dostępne dla Ciebie, możesz po prostu zadzwonić Database.Exists():

if (Database.Exists(connectionString)) 
{ 
    // do something 
} 
else 
{ 
    // do something else 
} 
+0

Dlaczego zostało to odrzucone? Działa i pasuje do "eleganckiej" prośby. Jest znacznie bardziej elegancki niż używanie wyjątków jako części przepływu logiki. Dodałem zastrzeżenie dotyczące Entity Framework, która jest biblioteką Microsoft zaprojektowaną do użytku z MS SQL Server. –

1

To co pracował dla mnie, aby zweryfikować istnienie dowolnej bazy danych PostgreSQL z C#:

private bool chkDBExists(string connectionStr, string dbname) 
{ 
    using (NpgsqlConnection conn = new NpgsqlConnection(connectionStr)) 
    { 
     using (NpgsqlCommand command = new NpgsqlCommand 
      ($"SELECT DATNAME FROM pg_catalog.pg_database WHERE DATNAME = '{dbname}'", conn)) 
     { 
      try 
      { 
       conn.Open(); 
       var i = command.ExecuteScalar(); 
       conn.Close(); 
       if (i.ToString().Equals(dbname)) //always 'true' (if it exists) or 'null' (if it doesn't) 
        return true; 
       else return false; 
      } 
      catch (Exception e) { return false; } 
     } 
    } 
} 

** Jeśli użyte w instrukcji try-catch może po prostu sprawdzić, czy zwrot ExecuteScalar ma wartość null dla nieistniejącego DB i nie-null, jeśli istnieje.

0

można uzyskać listę Database z poniżej i sprawdź swoją nazwę DB:

USE master 
GO 
SELECT name, database_id, create_date 
FROM sys.databases ; 
GO 
Powiązane problemy