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
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
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
.
Po prostu spróbuj DBConnection.Open() owinięte w blok try blokujący DBException.
O eleganckim rozwiązaniu, które znajdziesz.
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
}
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
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
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
.
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ść. –
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
@peacedog stąd SELECT GETDATE() –
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.
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
}
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. –
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.
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
To powinno być prawidłowa odpowiedź ... – bryanmac
jak mogę wiedzieć powyżej zwrotów zapytania? – revolutionkpi