質問

DBの存在を確認するためのエレガントな方法がある場合は、

私は疑問に思って?簡単に言うと、どのようにデータベースの接続文字列の接続をテストしますか。

おかげ

役に立ちましたか?

解決

接続文字列でInitial Catalog=masterを設定し、実行します:

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

データベースの名前に設定@nameと。

あなたは全体の(独立したデータベースのといない存在)として、接続文字列を確認したい場合は、

try/catchブロックで、それに接続してみてください。

他のヒント

あなたはそれに接続してみてください。それが例外をスローした場合は、接続文字列は、何らかの方法で悪いです、どちらかのデータベースが存在しない、パスワードが間違っている、または何か他のものである。

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

の可能性(サーバが存在しない場合、データベースが存在しない、ない、ログイン、無許可、サーバーダウンなど)の範囲をカバーするために - 最もシンプルなアイデアは、通常通りに接続しようと、些細な何かを実行するだけです - 例えばSELECT GETDATE()。あなたは例外を取得した場合、問題があります!

try/catchが最も実用的な選択肢である(アウトプロセスシステムを扱う特に)時間があります。

ただ、DBExceptionをキャッチtryブロックに包まれDBConnection.Openを()してみてください。

のようにエレガントなソリューションについては、あなたが見つけるしようとしているよう。

してみてください。

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(文字列) に。私はそれが、新しい接続試行を少なくSQL Serverのリソースを使用できると思います。

あなたは、単に呼び出すことができ、エンティティフレームワークを使用するか、あなたにそれを用意している場合は、<のhref = "https://msdn.microsoft.com/en-us/library/gg696588(v=vs.113) .aspxの」REL = "nofollowを"> 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; }
        }
    }
}
それが存在する場合は、ExecuteScalarのリターンが存在しないDBのためのヌルとヌルでない場合は、

**ザ・のtry-catch文で使用されている場合は、単にチェックすることができます。

あなたは以下とデータベースのリストを取得し、あなたのDB名を確認することができます:

USE master
GO  
SELECT name, database_id, create_date  
FROM sys.databases ;  
GO
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top