如何检查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