我想知道是否有一种优雅的方式来检查数据库是否存在?简而言之,如何测试数据库连接字符串的连接?
谢谢
在连接字符串中设置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() 包裹在捕获 DBException 的 try 块中。
与您将找到的一样优雅的解决方案。
尝试
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 资源然后新的连接尝试。
如果您正在使用实体框架或有它可供您使用,您可以简单地调用Database.Exists():
if (Database.Exists(connectionString))
{
// do something
}
else
{
// do something else
}
这就是我用 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 是否为空,如果存在则不为空。
您可以获取以下数据库列表并检查您的数据库名称:
USE master
GO
SELECT name, database_id, create_date
FROM sys.databases ;
GO