Как проверить наличие БД?

Мне интересно, есть ли элегантный способ проверить существование БД? Вкратце, как проверить подключение строки подключения к БД?

Спасибо


person Martin    schedule 16.05.2009    source источник


Ответы (8)


Установите Initial Catalog=master в строке подключения и выполните:

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

с @name установленным на имя базы данных.

Если вы хотите проверить строку подключения в целом (а не наличие независимой базы данных), попробуйте подключиться к ней в блоке try/catch.

person mmx    schedule 16.05.2009
comment
как я могу узнать, что выше возвращаемый запрос? - person revolutionkpi; 22.12.2011

Чтобы охватить диапазон возможностей (сервер не существует, база данных не существует, нет входа в систему, нет разрешений, сервер не работает и т. д.) - самая простая идея - просто попытаться подключиться как обычно и выполнить что-то тривиальное - SELECT GETDATE() для пример. Если вы получаете исключение, есть проблема!

Бывают случаи (особенно при работе с внепроцессными системами), когда try/catch является наиболее прагматичным вариантом.

person Marc Gravell    schedule 16.05.2009
comment
Кто бы ни проголосовал за это - это дешевый выстрел (если я не сделал что-то глупое?). Это то же самое, что и принятый ответ, на который ответили в те же сроки. У тебя есть моя жалость. - person Marc Gravell; 17.05.2009
comment
Мы сочли необходимым выполнить команду, а не просто открыть соединение, для проверки состояния нашей сети (на самом деле мы можем сохранить данные для проверки базы данных). - person peacedog; 03.08.2011
comment
@peacedog, следовательно, SELECT GETDATE() - person Marc Gravell; 03.08.2011
comment
Я подтверждал ваш ответ этим комментарием FWIW (я тоже голосовал!). - person peacedog; 04.08.2011

Вы можете просто попробовать подключиться к нему. Если он выдает исключение, то строка подключения каким-то образом неверна, либо база данных не существует, либо неверный пароль, либо что-то еще.

DbConnection db = new SqlConnection(connection_string);
try
{
    db.Open();
}
catch ( SqlException e )
{
    // Cannot connect to database
}
person Stephen Jennings    schedule 16.05.2009
comment
Справедливости ради, это может не сработать по многим причинам, таким как неправильный формат, отключенный пользователь, неверный пароль и так далее. - person cletus; 17.05.2009
comment
Мы нашли этот метод ненадежным, fwiw. Отключенная рабочая станция от сети, код по-прежнему сообщал об открытом соединении. Подозреваю, что это особенность пула соединений. - person peacedog; 03.08.2011

Просто попробуйте DBConnection.Open(), завернутый в блок try, перехватывающий DBException.

Самое элегантное решение, которое вы собираетесь найти.

person Serapth    schedule 16.05.2009

пытаться

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, чем новая попытка подключения.

person abatishchev    schedule 16.05.2009

Если вы используете Entity Framework или она вам доступна, вы можете просто вызвать Database.Exists():

if (Database.Exists(connectionString))
{
    // do something
}
else
{
    // do something else
}
person Hank Schultz    schedule 07.03.2016
comment
Почему за это проголосовали? Это работает и соответствует элегантному запросу. Это намного элегантнее, чем использование исключений как части логического потока. Я добавил предостережение об Entity Framework, библиотеке Microsoft, предназначенной для использования с MS SQL Server. - person Hank Schultz; 03.05.2016

Это то, что помогло мне проверить существование любой базы данных 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 нулевым для несуществующей БД и не нулевым, если она существует.

person gyslinn    schedule 02.02.2017

вы можете получить список баз данных ниже и проверить свое имя базы данных:

USE master
GO  
SELECT name, database_id, create_date  
FROM sys.databases ;  
GO
person Mahdi Emari    schedule 16.02.2018