2010-08-13 116 views
3

在試圖針對SQL Server 2008 Express實例測試無效連接字符串時,我發現這種奇怪的行爲:指定無效的Initial Catalog會產生一個SQLException,其Number有時爲233,有時18456.SQL Server連接任意返回233或18456錯誤代碼

代碼可能會說明它更好。

// The following connection string has a purposely incorrect initial catalog: 
string invalidConnString = @"Data Source=.\SQLEXPRESS;Initial Catalog=INVALID_DATABASE_NAME;User Id=dummyUser;Password=dummyPassw;"; 

SqlConnection connection = new SqlConnection(invalidConnString); 

try 
{ 
    connection.Open(); 
} 
catch (SqlException sex) 
{ 
    Console.WriteLine(sex.Number); // I "randomly" get either 233 or 18456 
    throw; 
} 
finally 
{ 
    connection.Close(); 
} 

從聯機叢書的system error codes指定

  • - 成功建立的連接與服務器,但隨後在登錄過程中出現了錯誤。 (提供者:共享內存提供程序,錯誤:0 - 無過程是在管道的另一端。)
  • - 登錄失敗,用戶%1!
'%1!'。

我認爲這兩種說法都不一樣:登錄失敗。但是,爲什麼不一致?

回答

3

溫貝託,

這在使用SQL Express和根本原因很常見的問題是AUTO_CLOSE數據庫選項默認情況下,SQL Express的開啓。當數據庫的所有用戶關閉時,數據庫將關閉並乾淨地關閉。當用戶下次登錄時,如果數據庫重新打開,則無法快速驗證該數據庫用戶的權限。

AUTO_CLOSE還有其他副作用,它刷新過程緩存,並可能導致更高的CPU成本。

低調命令是你的朋友。

ALTER DATABASE DBNAME SET AUTO_CLOSE OFF 

http://msdn.microsoft.com/en-us/library/bb522682.aspx

+0

很不錯的!即使我不再參與原始項目,我也會接受你的答案。謝謝! – Humberto 2011-04-03 21:10:58