如何检查DB的存在?

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

谢谢

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

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

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

如果要将连接字符串作为一个整体检查(并且不存在独立数据库),请尝试在try/catch块中连接它。

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

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

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

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

只需尝试一个包含在try块中的DBConnection.Open()捕获DBException。

关于优雅的解决方案,你会发现。

尝试

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

如果您正在使用Entity Framework或者可以使用它,则只需调用Database.Exists() :

 if (Database.Exists(connectionString)) { // do something } else { // do something else } 

这对我来说用C#来validation任何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。

你可以获得下面的数据库列表并检查你的数据库名称:

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