1

SQL サーバーがオンラインであることを確認する方法があります。これは、コードの接続に依存する部分で使用します。

正常に動作しますが、実行に最大 20 ミリ秒かかることに気付きました。SQL サーバーをチェックして確実に起動するためのより良い方法を誰かが知っているかどうか疑問に思っていました。

これが私の既存のコードです。

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
        public static bool IsSqlServerOnline(string connectionString)
        {
#if DEBUG || DEBUG_SINGLE_CORE
            Stopwatch sw = new Stopwatch();
            sw.Start();
#endif

#if DEBUG || DEBUG_SINGLE_CORE
            // This sould only occur of we are in the VSTS designer
            if (string.IsNullOrEmpty(connectionString))
            {
                return false;
            }
#endif

            if ( !NetworkInterface.GetIsNetworkAvailable() )
            {
                return false;
            }

            if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString");

            bool isSqlServerOnline = false;
            SqlConnectionStringBuilder conString = new SqlConnectionStringBuilder(connectionString);

            try
            {
                using (Ping p = new Ping())
                {
                    string sqlSvr = conString.DataSource;
                    if (sqlSvr != null)
                        isSqlServerOnline = p.Send(sqlSvr).Status == IPStatus.Success;
                }
            }
            catch (PingException)
            {
                isSqlServerOnline = false;
            }

            if ( isSqlServerOnline )
            {
                try 
                {
                    conString.ConnectTimeout = 3;
                    using (SqlConnection conn = new SqlConnection(conString.ToString()))
                    {
                        conn.Open();
                        isSqlServerOnline = true;
                    }
                }
                catch ( Exception )
                {
                    isSqlServerOnline = false;
                }
            }

#if DEBUG || DEBUG_SINGLE_CORE
            sw.Stop();
            Trace.WriteLine(string.Format("IsSqlServerOnline: {0}", sw.ElapsedMilliseconds));
#endif
            return isSqlServerOnline;
        }
4

3 に答える 3

2

コードは、SQLServerへの接続を確立できるかどうかを確認します。さらに一歩進んで、次のようなものを実行してクエリに応答していることを確認することもできます。

Select @@version
于 2009-12-18T16:34:04.077 に答える
1

他の人が述べているように、20msの障壁はおそらく心配することは何もありません。ただし、コードが呼び出される頻度を尋ねる場合がありますか?通話の結果を3〜5秒間(または2〜3秒間)キャッシュするだけで十分でしょうか?毎回ネットワークにアクセスする代わりに?2〜3秒はかなり小さなキャッシュウィンドウであり、「サーバーアライブ」チェックがOKを返すことができず、コードの実行中にサーバーがクラッシュしたことは言うまでもありません。無駄にしているのが(せいぜい)数秒ごとに20ミリ秒である場合、それはほとんど心配する必要はありません。

于 2009-12-18T16:33:38.477 に答える
1

Windows サービス コントロール マネージャー API を使用できます。

  1. OpenSCManagerを呼び出します(パラメーターとしてホスト名があります)
  2. OpenService を呼び出す
  3. QueryServiceStatusを呼び出す

ステータスが SERVICE_RUNNING の場合、サービスは稼働しています。

P/Invoke に興味がない場合は、 をご覧くださいSystem.ServiceProcess.ServiceController。関数

public ServiceController(string name, string machineName)

特定のサービスのステータスを取得するために使用される可能性があるようです。

于 2009-12-18T16:15:09.790 に答える