5

我想知道是否有一种优雅的方式来检查数据库是否存在?简而言之,如何测试数据库连接字符串的连接?

谢谢

4

8 回答 8

18

在连接字符串中设置Initial Catalog=master并执行:

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

设置@name为数据库的名称。

如果您想检查整个连接字符串(而不是独立数据库的存在),请尝试在一个try/catch块中连接到它。

于 2009-05-16T20:41:51.363 回答
5

为了涵盖各种可能性(服务器不存在,数据库不存在,没有登录,没有权限,服务器关闭等) - 最简单的想法是简单地尝试正常连接,并执行一些微不足道的事情 -SELECT GETDATE()例如. 如果遇到异常,那就有问题了!

有时(尤其是在处理进程外系统时)try/catch是最实用的选择。

于 2009-05-16T20:45:06.690 回答
4

您可以尝试连接到它。如果它抛出异常,那么连接字符串在某种程度上是错误的,或者数据库不存在,密码错误,或者其他什么。

DbConnection db = new SqlConnection(connection_string);
try
{
    db.Open();
}
catch ( SqlException e )
{
    // Cannot connect to database
}
于 2009-05-16T20:44:17.643 回答
1

只需尝试将 DBConnection.Open() 包裹在捕获 DBException 的 try 块中。

与您将找到的一样优雅的解决方案。

于 2009-05-16T20:43:35.133 回答
1

尝试

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 server 资源然后新的连接尝试。

于 2009-05-16T21:08:58.800 回答
1

如果您正在使用实体框架或有它可供您使用,您可以简单地调用Database.Exists()

if (Database.Exists(connectionString))
{
    // do something
}
else
{
    // do something else
}
于 2016-03-07T16:20:28.467 回答
1

这就是我用 C# 验证是否存在任何 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 语句中使用的 if 可以简单地检查 ExecuteScalar 的返回对于不存在的 DB 是否为空,如果存在则不为空。

于 2017-02-02T20:42:06.803 回答
0

您可以获取以下数据库列表并检查您的数据库名称:

USE master
GO  
SELECT name, database_id, create_date  
FROM sys.databases ;  
GO
于 2018-02-16T04:30:54.487 回答