Мне интересно, есть ли элегантный способ проверить существование БД? Вкратце, как проверить подключение строки подключения к БД?
Спасибо
Мне интересно, есть ли элегантный способ проверить существование БД? Вкратце, как проверить подключение строки подключения к БД?
Спасибо
Установите Initial Catalog=master
в строке подключения и выполните:
select count(*) from sysdatabases where name = @name
с @name
установленным на имя базы данных.
Если вы хотите проверить строку подключения в целом (а не наличие независимой базы данных), попробуйте подключиться к ней в блоке try/catch
.
Чтобы охватить диапазон возможностей (сервер не существует, база данных не существует, нет входа в систему, нет разрешений, сервер не работает и т. д.) - самая простая идея - просто попытаться подключиться как обычно и выполнить что-то тривиальное - SELECT GETDATE()
для пример. Если вы получаете исключение, есть проблема!
Бывают случаи (особенно при работе с внепроцессными системами), когда try/catch
является наиболее прагматичным вариантом.
Вы можете просто попробовать подключиться к нему. Если он выдает исключение, то строка подключения каким-то образом неверна, либо база данных не существует, либо неверный пароль, либо что-то еще.
DbConnection db = new SqlConnection(connection_string);
try
{
db.Open();
}
catch ( SqlException e )
{
// Cannot connect to database
}
Просто попробуйте DBConnection.Open(), завернутый в блок try, перехватывающий DBException.
Самое элегантное решение, которое вы собираетесь найти.
пытаться
IF NOT EXISTS(SELECT * FROM sys.databases WHERE [name] = @name)
CREATE DATABASE @name;
GO
or
IF db_id(@name) IS NOT NULL
CREATE DATABASE @name;
GO
или SqlConnection.ChangeDatabase(String). Я думаю, что он может использовать меньше ресурсов сервера sql, чем новая попытка подключения.
Если вы используете Entity Framework или она вам доступна, вы можете просто вызвать Database.Exists():
if (Database.Exists(connectionString))
{
// do something
}
else
{
// do something else
}
Это то, что помогло мне проверить существование любой базы данных Postgres с С#:
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; }
}
}
}
** Если используется в операторе try-catch, можно просто проверить, является ли возврат ExecuteScalar нулевым для несуществующей БД и не нулевым, если она существует.
вы можете получить список баз данных ниже и проверить свое имя базы данных:
USE master
GO
SELECT name, database_id, create_date
FROM sys.databases ;
GO