小编典典

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

sql

我正在处理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-在1秒内完成数据库模型(数据库ID
3)的恢复(分析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’。


阅读 225

收藏
2021-04-14

共1个答案

小编典典

基于此链接,最佳做法是查询Collat​​ion属性的值。

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

因此,当Collat​​ion属性不为null时,数据库已准备好进行连接。查询看起来像这样

SELECT DATABASEPROPERTYEX('MyDatabase', 'Collation')
2021-04-14