0

我正在編寫一個從啓動文件夾運行的應用程序,並嘗試連接到本地SQLServer2008-r2數據庫,作爲應用程序啓動過程的一部分。我連接到數據庫設置爲使用Windows身份驗證,並在應用我的連接字符串是標準的舊的連接字符串: Data Source=localhost\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security=True啓動程序連接到本地數據庫時存在間歇性問題

實際建立連接的代碼如下所示:

String connectionstring = "Data Source=localhost\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security=True"; 
SqlConnection cn = new SqlConnection(connectionstring); 

bool databaseUp = false; 

void Start() 
{ 
    CheckSQLService(); 

    for (int i = 0; i < 600; i++) 
    { 
     if (ConnectToDB()) 
     { 
      Console.WriteLine("Database is up and running."); 
      databaseUp = true; 
     } 
     else 
     { 
      Console.WriteLine("Database Connection Failed"); 

      CheckSQLService(); 

      Console.WriteLine("Trying again"); 
      Thread.Sleep(1000); 
     } 
    } 

    if(!databaseUp) 
    { 
     Console.WriteLine("Database Not Connected: exited loop."); 
    } 
} 

bool ConnectToDB() 
{ 
    try 
    { 
     cn.Open(); 
     return true; 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
     return false; 
    } 
} 

void CheckSQLService() 
{ 
    System.ServiceProcess.ServiceController SC = new System.ServiceProcess.ServiceController("MSSQL$SQLEXPRESS"); 
    Console.WriteLine(" = = = Checking SQL Service Status: = = = " 
     + "\n ServiceName : " + SC.ServiceName 
     + "\n State  : " + SC.Status 
     + "\n Stoppable : " + SC.CanStop 
     + "\n Pausable : " + SC.CanPauseAndContinue 
     + "\n Can Shutdown: " + SC.CanShutdown); 
} 

基本上我循環,直到我得到一個連接,如果失敗,我睡覺,再試一次。

大部分時間(大約60%)我能夠在第一次嘗試時成功建立連接而沒有問題。有時候,這需要多次嘗試才能成功,並且應用程序會等待一段時間。我還會注意到,讀取CheckSQLService()會在我每次調用SQL服務時都進行驗證 - 只是有時會顯然拒絕我的Windows憑據。

有人有想法,爲什麼這可能會間歇性地發生?再次,這是Windows首次啓動時運行的應用程序的一部分,因此可能會有許多因素在起作用(例如其他進程或服務未完全加載,或者在同一時間開始等)。

+0

[您是否在數據庫中設置了AutoClose選項](http://blogs.msdn.com/b/buckwoody/archive/2009/06/24/sql-server-best-practices-autoclose-should-待off.aspx)? – 2014-09-25 00:48:05

回答

0

僅僅因爲SQL Server服務正在運行並不意味着它已準備好接受連接。

由於您總是能夠最終連接,並且您的程序在計算機啓動時運行,所以我強烈懷疑您有時會在SQL Server完全初始化並準備好連接之前運行。

在典型的啓動順序中會發生許多事情。在SQL Server準備就緒之前,有時您的程序正在運行並不奇怪,反之亦然。