Клиент Sql службы Windows C # не может подключиться к базе данных после перезапуска SQL Server - PullRequest
0 голосов
/ 23 августа 2011

У меня есть служба Windows, которая обновляет данные в таблице базы данных на удаленном компьютере. Я хотел проверить, работает ли служба нормально после того, как сервер SQL вышел из строя и перезапустился по любой причине (это может быть перезапуск программного обеспечения сервера SQL или фактическая перезагрузка компьютера с Windows).

Я установил эту службу Windows на 10 серверах. Теперь, когда я перезапустил коробку сервера разработки sql, все клиентские сервисные программы, работающие во всех 10 коробках, не смогли восстановить соединение. Тем не менее, он работает нормально после перезапуска службы Windows клиента.

Я хочу, чтобы клиентские программы автоматически переподключались после того, как сервер стал доступен, и избегать их перезапуска вручную.

Любой совет, пожалуйста? Заранее спасибо. Ниже приведен код, который я использую для подключения к серверу sql.

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;
        }
    }

SQL Server - 2008 в Windows 2008 Enterprise R2. Клиентская программа на C #, разработанная в visual studio 2010, использует .net framework 4.

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

Ваш ConnectionPool имеет некоторые устаревшие подключения. Попытайтесь очистить их, используя SqlConnection.ClearAllPools ();

0 голосов
/ 23 августа 2011

Я предполагаю, что вы пытаетесь подключиться только один раз, и вы получаете исключение.Если вы этого не сделаете, то нижеприведенное не будет работать ...

Добавьте блок 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 ().

...