我想知道是否有一种优雅的方式来检查数据库是否存在?简而言之,如何测试数据库连接字符串的连接?
由于
答案 0 :(得分:17)
在连接字符串中设置Initial Catalog=master
并执行:
select count(*) from sysdatabases where name = @name
将@name
设置为数据库的名称。
如果要检查整个连接字符串(并且不存在独立数据库),请尝试在try/catch
块中连接它。
答案 1 :(得分:4)
您可以尝试连接它。如果它抛出异常,那么连接字符串在某种程度上是错误的,数据库不存在,密码错误或其他。
DbConnection db = new SqlConnection(connection_string);
try
{
db.Open();
}
catch ( SqlException e )
{
// Cannot connect to database
}
答案 2 :(得分:3)
要涵盖各种可能性(服务器不存在,数据库不存在,没有登录,没有权限,服务器关闭等) - 最简单的想法就是尝试正常连接,并执行一些微不足道的事情 - 例如SELECT GETDATE()
。如果你得到例外,那就有问题了!
有些时候(特别是在处理进程外系统时)try/catch
是最实用的选项。
答案 3 :(得分:1)
只需尝试将DBConnection.Open()包装在try块中捕获DBException。
关于您将要找到的优雅解决方案。
答案 4 :(得分: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服务器资源,然后尝试新的连接。
答案 5 :(得分:1)
如果您正在使用Entity Framework或者可以使用它,则只需致电Database.Exists():
LinkedHashMap<?,?>
答案 6 :(得分: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是否为null,如果存在则不为null。
答案 7 :(得分:0)
您可以获取下面的数据库列表并检查您的数据库名称:
USE master
GO
SELECT name, database_id, create_date
FROM sys.databases ;
GO