Как проверить наличие БД? - PullRequest
5 голосов
/ 17 мая 2009

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

Спасибо

Ответы [ 8 ]

17 голосов
/ 17 мая 2009

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

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

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

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

4 голосов
/ 17 мая 2009

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

DbConnection db = new SqlConnection(connection_string);
try
{
    db.Open();
}
catch ( SqlException e )
{
    // Cannot connect to database
}
3 голосов
/ 17 мая 2009

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

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

1 голос
/ 02 февраля 2017

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

** Если используется в операторе try-catch, можно просто проверить, является ли возвращение ExecuteScalar нулевым для несуществующей БД и не нулевым, если он существует.

1 голос
/ 07 марта 2016

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

if (Database.Exists(connectionString))
{
    // do something
}
else
{
    // do something else
}
1 голос
/ 17 мая 2009

1001 * попробовать *

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

или

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

или SqlConnection.ChangeDatabase (String) . Я думаю, что он может использовать меньше ресурсов сервера SQL, чем новая попытка подключения.

1 голос
/ 17 мая 2009

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

Примерно такое же элегантное решение, как вы найдете.

0 голосов
/ 16 февраля 2018

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

USE master
GO  
SELECT name, database_id, create_date  
FROM sys.databases ;  
GO
...