2010-08-13 102 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