0

SQLサーバーが接続可能かどうかをチェックする小さなコードを作成しようとしています。そして:そうであれば、データベースが存在するかどうかを確認する必要があります。コードで説明しましょう。

これは私の主な方法です:

private static void Main(string[] args)
        {
            Database.SetInitializer<MyDbContext>(new DropCreateDatabaseAlways<MyDbContext>());
            Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS2;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3"));
            Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3"));
            Console.WriteLine(CheckIfDatabaseExists("Data Source=127.0.0.1\\SQLEXPRESS2;Initial Catalog=SQLTest;Integrated Security=True;Connect Timeout=3"));
        }

ご想像のとおり、ローカル SQL サーバー「SQLEXPRESS」に既存のデータベース「SQLTest」があります。しかし: 'SQLEXPRESS2' のようなサーバーはありません!

わかりました - より多くのコード。ここに私のチェック方法があります:

public static DatabaseExistsStatus CheckIfDatabaseExists(String connString)
        {
          try
            {

                using (var db = new MyDbContext(connString))
                {
                    bool DbExists = db.Database.Exists();
                    if (DbExists)
                    {
                        // database is existing
                        return DatabaseExistsStatus.EXISTING;
                    }
                    else
                    {
                        // config is working, but database does not exist
                        return DatabaseExistsStatus.NO_DB;
                    }
                }
            }
            catch (Exception)
            {
                // no working config
                return DatabaseExistsStatus.NO_CONNECTION;
            }
        }

        public enum DatabaseExistsStatus
        {
            EXISTING,
            NO_CONNECTION,
            NO_DB
        }

アプリを起動すると、次の結果が得られます。

NO_CONNECTION
EXISTING 
NO_DB

私は混乱しています!私は "NO_CONNECTION, EXISTING, NO_CONNECTION" を期待していました。

それだけです!バックグラウンドで何が起こっているのか、制御を取得する方法がわかりません。

そこで何が起こっているのか、どうすれば修正できますか?

4

2 に答える 2

0

私が理解している限り(そしてリフレクターに入るまでは)、これは一種の予想される動作だと思います(少なくとも部分的には)。

DbContext の初期化方法に関するこの完全な説明をご覧ください。Code First: Inside DbContext Initialization

少し簡略化 -DbContextそれぞれのことを再作成しませんnew DbContext。内部では、EDM (エンティティ データ モデル) とその他のもの (「実際の」ObjectContextインスタンス) がAppDomain.

この特定のケースでは、最初の呼び出しは何もせず、サーバーの検索に失敗し、「実行可能な」代替手段がないため、単にエラーが発生し、「接続なし」になります。

次のパスで成功し、内部のデータの一部を初期化しました(これはAppDomainの「グローバル」であり、ほとんどの場合アプリを意味します)-「new DbContext」はほとんど何もしませんが、最初の使用では、あなたの場合は「Exists' Db を作成しませんが、(一見) 初期化を行います。

そして最後のパスで、接続を開こうとして失敗しますが、すでに初期化されているデータから再利用できる有効な接続が既にあります。

唯一の問題は、「失敗した」接続試行を「続行」し、古いものを再利用する理由です (明示的な呼び出しであるため)。 - またはバグ?)。

于 2012-04-20T16:00:04.977 に答える