2009-05-16 20 views
5

DBの存在を確認するエレガントな方法があるのでしょうか?簡単に言うと、db接続文字列の接続をテストするにはどうすればよいですか?DBの存在を確認する方法は?

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

データベースの名前に@nameセットで:接続文字列でInitial Catalog=masterを設定し、実行

おかげ

答えて

17

接続文字列全体をチェックしたい場合(独立したデータベースが存在しない場合)、try/catchブロックに接続してみてください。

+0

これが正しい答えでなければなりません... – bryanmac

+0

はどのように私は、クエリが返すの上に知ることができますか? – revolutionkpi

1

DBExceptionをキャッチするtryブロックでラップされたDBConnection.Open()を試してみてください。

あなたが見つけ出すほどエレガントな解決策について。

4

接続できます。例外をスローすると、データベースが存在しないか、パスワードが間違っているか、何か他の何らかの形で接続文字列が不良です。最も単純なアイデアは、通常通りに接続しようとするだけで、 - 可能性の範囲を(サーバが存在しない場合、データベースが存在しない、ない、ログイン、無許可、サーバーダウンなど)を覆う

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

不正確なフォーマット、無効なユーザー、間違ったパスワードなど、多くの理由でこれが失敗する可能性があります。 – cletus

+0

この方法は信頼性が低く、fwiwです。ネットワークからワークステーションを抜きましたが、コードはまだ開いている接続を報告しました。それは接続プーリングの奇妙なものだと思われます。 – peacedog

3

何かを些細なことを実行 - 例えばSELECT GETDATE()。例外が発生した場合は、問題があります。

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

+0

誰もがそれを落とした - それは安いショットです(私は何か愚かなことがない限り?)。受け入れられた答えと同じで、同じ時間枠で答えられます。あなたは私の同情がある。 –

+0

"ネットワークステータス"チェックの目的で、単に接続を開くだけでなく、コマンドを実行する必要があることがわかりました(実際には「データベースに保存する」チェック)。 – peacedog

+0

@peacedogしたがって、SELECT GETDATE() –

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 Serverのリソースを少なくしてから新しい接続を試みると思う。あなたはEntity Frameworkのを使用するか、あなたにそれを用意している場合は

0

することは、あなたは単にDatabase.Exists()を呼び出すことができます。

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

なぜこれがダウン表示されたのですか?それは動作し、 "エレガントな"要求に適合します。ロジックフローの一部として例外を使用するよりもはるかにエレガントです。 Entity Frameworkについての警告を追加しました。これはMS SQL Serverで使用するために設計されたMicrosoftライブラリです。 –

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ステートメントで使用される場合は、存在しないDBの場合はExecuteScalarの戻り値がnullで、存在しない場合はnullでないかどうかを単純に確認できます。

0

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

USE master 
GO 
SELECT name, database_id, create_date 
FROM sys.databases ; 
GO 
関連する問題