SQL Server连接任意返回233或18456错误代码

时间:2010-08-13 02:24:04

标签: sql-server ado.net

在尝试针对SQL Server 2008 Express实例测试无效连接字符串时,我发现了这种奇怪的行为:指定无效Initial Catalog会引发SQLException,其数量有时为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指定了

  • 233 - 已成功与服务器建立连接,但在登录过程中出错。 (提供者:共享内存提供者,错误:0 - 管道的另一端没有进程。)
  • 18456 - 用户'%。* ls'登录失败。%。* ls

我认为两者都有不同的说法:登录失败。但那么,为什么失败不一致?

1 个答案:

答案 0 :(得分:4)

温贝托,

这是使用SQL Express时非常常见的问题,根本原因是SQL Express默认情况下打开了AUTO_CLOSE数据库选项。当数据库的所有用户都关闭时,数据库将被关闭并干净地关闭。当用户下次登录时,如果数据库重新打开,则无法快速验证该数据库的用户权限。

AUTO_CLOSE还有其他副作用,它会刷新过程缓存,并且通常会导致更高的CPU成本。

低命令是你的朋友。

ALTER DATABASE DBNAME SET AUTO_CLOSE OFF

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