如何检查数据库是否存在?

5

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

谢谢。

8个回答

18

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

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

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

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


我怎么知道上面的查询返回了什么? - revolutionkpi

5

为了涵盖各种可能性(服务器不存在、数据库不存在、无登录、无权限、服务器宕机等)- 最简单的想法就是尝试正常连接并执行一些琐碎的操作 - 例如 SELECT GETDATE()。如果出现异常,那就有问题!

有时候(特别是在处理外部进程系统时),try/catch 是最实用的选择。


谁给那个回答点了踩——这是个不必要的攻击(除非我做了什么愚蠢的事情?)。它和被接受的回答一样,而且还是在同样的时间内回答的。你让我很同情。 - Marc Gravell
我们发现有必要执行一个命令,而不仅仅是打开一个连接,以便进行我们的“网络状态”检查(实际上是一个“我们能否将数据保存到数据库”的检查)。 - peacedog
@peacedog 因此选择 SELECT GETDATE()。 - Marc Gravell
我在这条评论中“确认”了你的答案(顺便说一句,我也投票了!)。 - peacedog
我喜欢使用SELECT GETDATE()快速检查并控制结果。 - Andrea Antonangeli

4

您可以尝试连接它。如果它抛出异常,则连接字符串存在问题,可能是数据库不存在、密码错误或其他原因。

DbConnection db = new SqlConnection(connection_string);
try
{
    db.Open();
}
catch ( SqlException e )
{
    // Cannot connect to database
}

1
公平地说,这可能会因为许多原因而失败,例如格式不正确、用户被禁用、密码不正确等等。 - cletus
我们发现这种方法不可靠,就此而言。即使将工作站从网络中拔出,代码仍然报告有一个打开的连接。怀疑这是连接池的一个怪癖。 - peacedog

2
如果您正在使用Entity Framework或者已经拥有它,您可以简单地调用Database.Exists()
if (Database.Exists(connectionString))
{
    // do something
}
else
{
    // do something else
}

为什么这个被踩了?它能够正常工作并符合“优雅”的要求。相比将异常作为逻辑流程的一部分,它更加优雅。我确实添加了关于Entity Framework的警告,它是一个专为与MS SQL Server一起使用而设计的微软库。 - Hank Schultz

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资源。

1

尝试在try块中包装一个DBConnection.Open(),并捕获DBException异常。

这是你能找到的最优雅的解决方案。


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的返回值是否为空,以确定不存在的数据库和存在的数据库是否为非空。


0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接