数据库未启动但SQL Server已准备好进行连接时出现SqlException

时间:2014-08-22 08:40:50

标签: c# sql .net sql-server exception

我正在处理SQL Server的“准备连接”状态与数据库启动时间之间的相当长的延迟。有时需要2分钟以上。这就是为什么我有时会在联机之前尝试连接数据库的原因。您知道吗,如何缩短“准备连接”和启动数据库之间的时间?或者我如何确定数据库是否在线以从我的C#应用​​程序连接到它?

基本上我通过连接字符串有一些连接的“缓存”。第一次连接当然会发生这种情况,因此我的连接代码非常简单:

var result = new SqlConnection();

result.ConnectionString = "some connection string here";

try
{
   result.Open()
}
catch (Exception ex)
{
   //some logging stuff here
   throw;
}

这是C#例外:

  

System.Data.SqlClient.SqlException:无法打开登录请求的数据库“XXX”。登录失败。

这是SQL Server日志:

  

2014-03-31 08:21:05.65 - SQL Server现在已准备好进行客户端连接。这是一条情报信息;无需用户操作。

     

2014-03-31 08:21:09.21 - 数据库模型(数据库ID 3)在1秒内完成恢复(分析234毫秒,重做0毫秒,撤消514毫秒)这只是一条信息性消息。无需用户操作。

     

2014-03-31 08:21:11.52 - 错误:18456,严重程度:14,状态:38。

     

2014-03-31 08:21:11.52 - 用户'YYY'登录失败。原因:无法打开显式指定的数据库。 [客户:]

     

2014-03-31 08:21:13.88 - 清除tempdb数据库。

     

2014-03-31 08:21:21.38 - 数据库msdb(数据库ID 4)在2秒内完成恢复(分析327毫秒,重做0毫秒,撤消468毫秒)这只是一条信息性消息。无需用户操作。

     

2014-03-31 08:21:32.98 - 启动数据库'tempdb'。

     

2014-03-31 08:21:40.30 - Service Broker协议传输已禁用或未配置。

     

2014-03-31 08:21:40.41 - 数据库镜像协议传输已禁用或未配置。

     

2014-03-31 08:21:41.50 - 恢复已完成。这仅是一条信息性消息。无需用户操作。

     

2014-03-31 08:21:41.52 - Service Broker经理已经开始。

     

2014-03-31 08:23:41.87 - 启动数据库'XXX'。

1 个答案:

答案 0 :(得分:3)

基于this link,最佳做法是查询Collat​​ion属性的值。

  

刚上线的数据库不一定准备好接受连接。要确定数据库何时可以接受连接,请查询sys.databases的collat​​ion_name列或DATABASEPROPERTYEX的Collat​​ion属性。

因此,当Collat​​ion属性不为null时,数据库就可以进行连接了。查询看起来像这样

SELECT DATABASEPROPERTYEX('MyDatabase', 'Collation')