SQL Server重新启动后,C#Windows服务Sql客户端无法连接到数据库

时间:2011-08-23 18:09:02

标签: c# sql-server windows-services restart

我有一个Windows服务,它将数据更新到远程计算机中的数据库表。我想检查SQL服务器因任何原因停机并重新启动后服务是否正常(可能是SQL服务器软件重启或实际的Windows机器突然重启)。

我在10台服务器上安装了这个Windows服务。现在,当我重新启动开发sql server框时,所有10个框中运行的所有客户端服务程序都无法重新连接。但是,重新启动客户端Windows服务后,它工作正常。

我希望客户端程序在服务器可用后自动重新连接,并避免手动重新启动它们。

有什么建议吗?提前致谢。 下面是我用来连接sql server的代码。

private bool ConnectToSqlServer()
    {
        try
        {
            if (sqlConnection.State == ConnectionState.Closed)
            {
                sqlConnection.Open();
                return true;
            }
            return false;
        }
        catch(Exception Ex)
        {
            eventLog1.WriteEntry("ConnectToSqlServer " + Ex.Message, EventLogEntryType.Error);
            return false;
        }
    }

Windows 2008 Enterprise R2上的SQL Server - 2008。 客户端程序是C#,在visual studio 2010中开发,它使用.net框架工作4。

2 个答案:

答案 0 :(得分:0)

我假设你只是尝试连接一次而且你得到了一个例外。如果你不是,那么以下将不起作用......

在您访问客户端数据库的任何位置添加SqlException Catch块。然后从该SqlException块调用重试连接每x秒进行y次迭代的逻辑。如下所示:

try
{ 
    //Database access code here
}
catch(SqlException sexc)
{
    if (!ReconnectToDatabase())
    {
        // log error to event log
    }
}

private bool ReconnectToDatabase()
{
   bool isConnected = false;
   for (int i = 0; i < 5; i++)  // 5 is arbitrary, use whatever retry count you want
   {
       if (ConnectToSqlServer())
       {
           break;
       }
       System.Threading.Thread.Sleep(5000);  // 5 seconds is arbitrary
   }
}

同样,此帖子的重试次数和等待时间是任意的。您需要考虑客户端等待的停机时间,以及SQL Server重启通常需要多长时间。

如果您正在尝试重新连接,那么在SqlException块中,调用SqlConnection.ClearAllPools()。

答案 1 :(得分:0)

您的ConnectionPool有一些陈旧的连接。尝试使用SqlConnection.ClearAllPools();

清除它们