2014-05-07 92 views
2

我正在使用LINQ to SQL(dbml),並且想要在繼續​​之前檢查連接字符串的連接是否有效..例如,if連接字符串中的IP不正確(或數據庫關閉),程序崩潰並希望對此進行檢查。我試過這個:LINQ to SQL,檢查連接字符串的連接是否有效

if (DataContext.DatabaseExists()) 
    MessageBox.Show("Connection Exists"); 

如果連接有效,但是如果連接無效,它會凍結if語句。我還能做什麼或做什麼?

<add name="NflDataEntities" connectionString="metadata=res://*/NflData.csdl|res://*/NflData.ssdl|res://*/NflData.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=10.10.***.***;initial catalog=NflData;persist security info=True;user id=*****;password=****;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" /> 

回答

2

這是設計。它「凍結」,因爲它正在掃描網絡尋找數據庫服務器。如果未找到,則返回false,但這可能需要一些時間。

還有其他一些驗證服務器的選項,如this one here。您需要使用SqlConnectionStringBuilder解析連接字符串並獲取DataSource。有了這些信息,你就可以運行該命令並獲得響應。您需要重定向標準輸出,然後解析輸出。總之,不是一個非常好的選擇。

+0

OIç..我會盡力讓它坐並看看它是否返回false ..所以沒有辦法解決這個問題嗎? – user1189352

+0

你是對的,它最終會失敗 – user1189352

+1

你可能想嘗試使用'context.CommandTimeout = 10'來導致失敗更快地返回。顯然這個屬性移動了不同的EF版本,請參閱http://stackoverflow.com/questions/6232633/entity-framework-timeouts各種選項。 – Steve

1

問題可能是對數據庫的請求有一個超時,必須在它返回之前打勾。嘗試將連接字符串中的超時臨時設置爲很短的時間(一秒或兩秒),並且可能會加快速度。

+0

好吧,讓我看看我是否可以嘗試在連接字符串中發現現在 – user1189352

+0

我編輯了OP來顯示連接字符串,但是我沒有看到任何地方我可以設置超時? – user1189352

+1

我相信默認超時是30秒,如果沒有指定。嘗試使用'SqlConnectionStringBuilder'來創建你的臨時字符串,並在那裏設置超時時間。 –

1

,同時表明該系統工作,因此UI,同時等待SQL響應不會凍結的消息可以運行異步方法:

ShowMessage("Loading"); // Running on UI thread 
     Task.Factory.StartNew(() => 
     { 
      try 
      { 
       return DataContext.DatabaseExists(); 
      } 
      catch (SqlException) 
      { 
       return false; 
      } 
     }).ContinueWith(isValid => 
     { 
      if (isValid.Result) 
       ShowMessage("Success"); 
      else 
       ShowMessage("Failure"); 
     }); 
+0

不錯,我會試一下,謝謝 – user1189352