Sql строка подключения с ошибкой

title description keywords services ms.service ms.subservice ms.custom ms.devlang ms.topic author ms.author ms.reviewer ms.date ms.openlocfilehash ms.sourcegitcommit ms.translationtype ms.contentlocale ms.lasthandoff ms.locfileid

Устранение временных ошибок

Узнайте, как устранять, диагностировать и предотвращать ошибки подключения SQL или временные ошибки при подключении к базе данных SQL Azure, Управляемый экземпляр Azure SQL и Azure синапсе Analytics.

подключение sql,строка подключения,проблемы с подключением, временная ошибка,ошибка подключения

sql-database

sql-database

development

sqldbrb=1

troubleshooting

dalechen

ninarn

sstein, vanto

01/14/2020

9f2e755047910aefa89c2f187cda956aca608b98

867cb1b7a1f3a1f0b427282c648d411d0ca4f81f

MT

ru-RU

03/19/2021

99093763

Устранение временных ошибок подключения в базе данных SQL и Управляемый экземпляр SQL

[!INCLUDEappliesto-sqldb-sqlmi-asa]

В этой статье описывается, как предотвратить, диагностировать и устранить ошибки подключения и временные ошибки, возникающие при взаимодействии клиентского приложения с базой данных SQL Azure, Azure SQL Управляемый экземпляр и Azure синапсе Analytics. Узнайте, как настроить логику повторных попыток, создать строку подключения и настроить другие параметры подключения.

Временные ошибки (временные сбои)

Временные ошибки (или временные сбои) возникают из-за причин, которые вскоре устраняются автоматически. Иногда временная ошибка возникает потому, что система Azure быстро сменяет аппаратные ресурсы, чтобы лучше распределить нагрузку, связанную с разными рабочими нагрузками. Большинство этих событий перенастройки завершаются менее чем за 60 секунд. Во время этого периода перенастройки могут возникнуть проблемы с подключением к базе данных в базе данных SQL. Приложения, подключающиеся к базе данных, должны быть построены для ожидания этих временных ошибок. и предусматривать их обработку путем реализации логики повторных попыток в коде вместо вывода пользователю сообщений об ошибках приложения.

Если клиентская программа использует пакет ADO.NET, ваша программа получает исключение SqlException и таким образом узнает о временной ошибке.

Подключение и команда

Повторите попытку подключения к базе данных SQL и SQL Управляемый экземпляр или установите ее снова в зависимости от следующих действий.

  • Временная ошибка возникает при попытке подключения.

Через несколько секунд повторите попытку подключения.

  • Временная ошибка возникает во время выполнения команды запроса базы данных SQL и SQL Управляемый экземпляр

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

Повтор логики для временных ошибок

Клиентские программы, в которых иногда происходят временные ошибки, являются более надежными, если используют логику повторных попыток. Когда программа взаимодействует с базой данных в базе данных SQL с помощью по промежуточного слоя стороннего производителя, спросите у поставщика, содержит ли по промежуточного слоя логику повторных попыток для временных ошибок.

Принципы повторных попыток

  • Если ошибка является временной, попробуйте установить соединение снова.
  • Не пытайтесь напрямую повторно использовать базу данных SQL или SELECT инструкцию sql управляемый экземпляр, которая завершилась сбоем с временной ошибкой. Установите новое подключение и повторите SELECT.
  • Когда база данных SQL или инструкция SQL Управляемый экземпляр UPDATE завершается с временной ошибкой, установите новое подключение, прежде чем повторять попытку обновления. Логика повторных попыток обеспечивает полноценное выполнение транзакции базы данных или откат всей транзакции.

Другие соображения по поводу повторных попыток

  • Пакетная программа, которая автоматически запускается после окончания рабочего дня и завершает свою работу до наступления утра, может выполнять повторные попытки с продолжительными интервалами.
  • Программа, использующая пользовательский интерфейс, должна учитывать, что человек не любит ждать очень долго. Это не значит, что нужно повторять попытку каждые несколько секунд, так как подобная политика может переполнить систему запросами.

Увеличение интервала между повторными попытками

Рекомендуется подождать 5 секунд, прежде чем выполнять первую повторную попытку. Повторная попытка после ожидания менее 5 секунд может привести к перегрузке облачной службы. Для каждой последующей повторной попытки ожидание должно увеличиваться экспоненциально, но не более чем до 60 секунд.

Обсуждение периода блокировки для клиентов, использующих ADO.NET, см. в разделе Организация пулов соединений (ADO.NET).

Вы также можете задать максимальное количество повторных попыток, которые программа должна выполнить перед автоматическим завершением работы.

Образцы кода с логикой повторных попыток

Образцы кода с логикой повторных попыток доступны по ссылкам:

  • Устойчивое подключение к Azure SQL с помощью ADO.NET
  • Устойчивое подключение к Azure SQL с помощью PHP

Тестирование логики повторных попыток

Чтобы протестировать логику повторных попыток, нужно имитировать или вызвать ошибку, которую можно исправить во время работы программы.

Тестирование с отключением от сети

Один из способов протестировать логику повторных попыток — это отключить клиентский компьютер от сети во время работы программы. Ошибка:

  • SqlException.Number = 11001
  • Сообщение: «Данный узел неизвестен.»

В рамках первой повторной попытки можно подключить клиентский компьютер к сети и попытаться подключиться.

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

  • Временно добавляет 11001 в свой список ошибок, чтобы эта ошибка считалась временной.
  • Первый раз пытается подключиться как обычно.
  • После выявления ошибки удаляет 11001 из списка.
  • Выводит сообщение с просьбой подключить компьютер к сети.
  • Программа приостанавливает дальнейшее выполнение с помощью метода Console.ReadLine или диалогового окна с кнопкой «ОК». Клавишу ВВОД пользователю нужно нажимать после подключения компьютера к сети.
  • Попытаться подключиться еще раз. В этот раз попытка должна завершиться успехом.

Проверка путем неправильного написания имени пользователя при подключении

Программа может намеренно сделать опечатку в имени пользователя перед первой попыткой подключения. Ошибка:

  • SqlException.Number = 18456
  • Сообщение: «Ошибка входа пользователя WRONG_MyUserName.»

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

Чтобы сделать это тестирование практичным, программа должна распознать параметр времени выполнения и сделать следующее:

  • Временно добавить 18456 в свой список ошибок, чтобы эта ошибка считалась временной.
  • Добавить элемент WRONG_ к имени пользователя.
  • После выявления ошибки удалить 18456 из списка.
  • Удалить WRONG_ из имени пользователя.
  • Попытаться подключиться еще раз. В этот раз попытка должна завершиться успехом.

Параметры .NET SqlConnection для повторной попытки подключения

Если клиентская программа подключается к базе данных в базе данных SQL с помощью платформа .NET Framework класса System. Data. SqlClient. SqlConnection, используйте .NET 4.6.1 или более поздней версии (или .NET Core), чтобы можно было использовать функцию повторного подключения. Дополнительные сведения об этой функции см. в разделе свойство SqlConnection. ConnectionString.

При создании строки подключения для объекта SqlConnection нужно правильно настроить значения следующих параметров.

  • ConnectRetryCount:     значение по умолчанию — 1. Диапазон — от 0 до 255.
  • ConnectRetryInterval:     значение по умолчанию — 10 секунд. Диапазон — от 1 до 60.
  • Время ожидания подключения:     по умолчанию — 15 секунд. Диапазон — от 0 до 2147483647.

В частности, выбранные значения должны обеспечивать равенство Connection Timeout = ConnectRetryCount * ConnectionRetryIntervall.

Например, если количество попыток — 3, интервал между ними составляет 10 секунд, а время ожидания подключения только 29 секунд, то у системы не останется времени для последней (третьей) попытки подключения: 29 < 3 * 10.

Подключение и команда

Параметры ConnectRetryCount и ConnectRetryInterval позволяют объекту SqlConnection повторять операцию подключения, не извещая об этом программу и не вынуждая ее управлять этим процессом. Повторные попытки будут выполняться в следующих ситуациях:

  • Вызов метода SqlConnection. Open
  • SqlConnection.Exeвызов метода милые

Есть один важный нюанс. Если во время выполнения запроса возникает временная ошибка, объект SqlConnection не пытается подключиться еще раз. Как следствие, запрос повторно не выполняется. Но перед отправкой запроса для выполнения объект SqlConnection очень быстро проверит наличие соединения. Если эта быстрая проверка обнаружит проблемы с подключением, SqlConnection повторит операцию подключения. Если повторная попытка подключения завершится успешно, запрос отправится на выполнение.

Нужно ли сочетать ConnectRetryCount с логикой повторных попыток в приложении?

Предположим, что в вашем приложении реализована надежная настраиваемая логика повторных попыток. Допустим, приложение повторяет операцию подключения четыре раза. Если вы добавите в строку подключения значения ConnectRetryInterval и ConnectRetryCount = 3, общее количество повторных попыток составит 4 * 3 = 12. Вряд ли вам действительно нужно такое количество повторных попыток.

Подключения к базе данных в базе данных SQL

Подключение: строка подключения

Строка подключения, необходимая для подключения к базе данных, немного отличается от строки, используемой для подключения к SQL Server. Строку подключения для своей базы данных вы можете скопировать на портале Azure.

[!INCLUDE sql-database-include-connection-string-20-portalshots]

Подключение: IP-адрес

Необходимо настроить базу данных SQL для приема подключения с IP-адреса компьютера, на котором размещена клиентская программа. Чтобы настроить эту конфигурацию, измените параметры брандмауэра с помощью портала Azure.

Если не задать IP-адрес, произойдет сбой программы и отобразится сообщение об ошибке, содержащее необходимый IP-адрес.

[!INCLUDE sql-database-include-ip-address-22-portal]

Дополнительные сведения см. в разделе Настройка параметров брандмауэра в базе данных SQL.

Подключение: порты

Обычно нужно убедиться лишь в том, что на компьютере, на котором установлено клиентское приложение, для исходящей связи открыт порт 1433.

Например, если ваша клиентская программа размещена на компьютере Windows, можно использовать брандмауэр Windows на этом узле, чтобы открыть порт 1433.

  1. Откройте панель управления.
  2. Выберите все элементы панели управления > Брандмауэр Windows > Дополнительные параметры > правила для исходящих подключений > действия > новое правило.

Если клиентская программа находится на виртуальной машине Azure, см. статью Порты для ADO.NET 4.5, отличные от порта 1433.

Общие сведения о настройке портов и IP-адресов в базе данных см. в разделе брандмауэр базы данных SQL Azure.

Подключение: ADO.NET 4.6.2 или более поздней версии

Если для подключения к Базе данных SQL программа применяет классы ADO.NET, например System.Data.SqlClient.SqlConnection, мы рекомендуем использовать .NET Framework 4.6.2 или более позднюю версию.

Начиная с ADO.NET 4.6.2:

  • Попытка повторного открытия подключения для SQL Azure будет выполнена немедленно, что повышает производительность приложений с поддержкой облака.

Начиная с ADO.NET 4.6.1:

  • Предлагает повышенную надежность подключения к базам данных SQL с помощью метода SqlConnection.Open. В методе Open теперь реализованы лучшие механизмы повторных попыток при временных сбоях, в частности для некоторых ошибок, которые возникают при ожидании соединения.
  • Поддерживается работа с пулами подключений, а также эффективная проверка функционирования объекта соединения, который видит ваша программа.

Когда вы используете объект соединения, входящий в пул подключений, программе следует временно закрывать подключение, если она его сейчас не использует. Повторное открытие подключения не требует высоких затрат, нужно просто создать новое подключение.

Если вы используете пакет ADO.NET 4.0 или более раннюю версию, мы рекомендуем обновить его до последней версии. С августа 2018 года доступна версия ADO.NET 4.6.2.

Диагностика

Диагностика: проверяет, могут ли служебные программы подключаться

Если программе не удается подключиться к базе данных в базе данных SQL, то один из вариантов диагностики заключается в попытке подключиться с помощью служебной программы. В идеале служебная программа подключается с помощью библиотеки, которую использует ваша программа.

На компьютерах под управлением Windows можно использовать следующие служебные программы:

  • SQL Server Management Studio (ssms.exe) подключается с помощью ADO.NET.
  • sqlcmd.exe подключается с помощью ODBC.

После подключения программы проверьте, работает ли короткий SQL-запрос SELECT.

Диагностика: проверка открытых портов

Если есть подозрение, что попытки подключения не удались из-за проблем с портом, запустите на компьютере служебную программу, которая сообщает о конфигурациях порта.

На компьютерах Linux можно использовать следующие служебные программы:

  • netstat -nap
  • nmap -sS -O 127.0.0.1 — вместо указанного в примере IP-адреса укажите свой.

В Windows можно использовать служебную программу PortQry.exe. Ниже приведен пример выполнения, который запросил ситуацию с портами в базе данных SQL и был запущен на переносном компьютере:

[C:Usersjohndoe]
>> portqry.exe -n johndoesvr9.database.windows.net -p tcp -e 1433

Querying target system called: johndoesvr9.database.windows.net

Attempting to resolve name to IP address...
Name resolved to 23.100.117.95

querying...
TCP port 1433 (ms-sql-s service): LISTENING

[C:Usersjohndoe]
>>

Диагностика: внесение ошибок в журнал

Эпизодические неисправности иногда лучше всего диагностировать, выявляя общий шаблон за несколько дней или недель подряд.

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

Для облегчения ведения журналов можно использовать Enterprise Library 6 (EntLib60), где используются классы .NET. Дополнительные сведения см. в статье 5 — As Easy As Falling Off a Log: Using the Logging Application Block (5. Простой вариант: использование решения Logging Application Block).

Диагностика: проверка системных журналов на наличие ошибок

Ниже приведены некоторые Transact-SQL-инструкции SELECT, которые запрашивают в журналах сведения об ошибках и прочую информацию.

Запрос у журнала Описание
SELECT e.*
FROM sys.event_log AS e
WHERE e.database_name = 'myDbName'
AND e.event_category = 'connectivity'
AND 2 >= DateDiff
  (hour, e.end_time, GetUtcDate())
ORDER BY e.event_category,
  e.event_type, e.end_time;
В представлении sys.event_log приводятся сведения об отдельных событиях, включая те, которые могут привести к временным ошибкам или проблемам с подключением.

В идеале значения start_time или end_time можно сопоставить с временем возникновения ошибок в клиентской программе.

Для выполнения этого запроса необходимо подключиться к базе данных master.

SELECT c.*
FROM sys.database_connection_stats AS c
WHERE c.database_name = 'myDbName'
AND 24 >= DateDiff
  (hour, c.end_time, GetUtcDate())
ORDER BY c.end_time;
Представление sys.database_connection_stats отображает суммарное количество событий каждого типа, что также бывает полезно при дополнительной диагностике.

Для выполнения этого запроса необходимо подключиться к базе данных master.

Диагностика: поиск событий проблемы в журнале базы данных SQL

Искать записи о событиях проблемы можно в журнале базы данных SQL. Попробуйте выполнить в базе данных master такую Transact-SQL-инструкцию SELECT:

SELECT
   object_name
  ,CAST(f.event_data as XML).value
      ('(/event/@timestamp)[1]', 'datetime2')                      AS [timestamp]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="error"]/value)[1]', 'int')             AS [error]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="state"]/value)[1]', 'int')             AS [state]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="is_success"]/value)[1]', 'bit')        AS [is_success]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="database_name"]/value)[1]', 'sysname') AS [database_name]
FROM
  sys.fn_xe_telemetry_blob_target_read_file('el', null, null, null) AS f
WHERE
  object_name != 'login_event'  -- Login events are numerous.
  and
  '2015-06-21' < CAST(f.event_data as XML).value
        ('(/event/@timestamp)[1]', 'datetime2')
ORDER BY
  [timestamp] DESC
;

Несколько возвращенных строк из sys.fn_xe_telemetry_blob_target_read_file

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

object_name                   timestamp                    error  state  is_success  database_name

database_xml_deadlock_report  2015-10-16 20:28:01.0090000  NULL   NULL   NULL        AdventureWorks

Enterprise Library 6

Enterprise Library 6 (EntLib60) — это платформа классов .NET, которая помогает реализовать надежные клиенты облачных служб, одна из которых является базой данных SQL. Дополнительные сведения обо всех полезных возможностях EntLib60 вы найдете в этой статье.

Одна из областей, в которой может помочь EntLib60, — логика повторных попыток для обработки временных ошибок. Дополнительные сведения см. в статье 4 — Perseverance, Secret of All Triumphs: Using the Transient Fault Handling Application Block (4. Настойчивость — секрет всех побед. Использование блока приложения для обработки временных ошибок).

[!NOTE]
Исходный код для EntLib60 доступен для открытого скачивания в Центре загрузки. Корпорация Майкрософт не планирует обновлять функции и менять характер обслуживания библиотеки EntLib.

Классы EntLib60 для временных ошибок и повторов

Следующие классы EntLib60 особенно полезны для логики повторных ошибок. Все эти классы входят в пространство имен Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling или во вложенные пространства.

В пространстве имен Microsoft. Practices. EnterpriseLibrary. TransientFaultHandling:

  • RetryPolicy ;
    • ExecuteAction ;
  • Класс exponentialbackoff;
  • SqlDatabaseTransientErrorDetectionStrategy ;
  • ReliableSqlConnection ;
    • ExecuteCommand ;

В пространстве имен Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:

  • AlwaysTransientErrorDetectionStrategy ;
  • NeverTransientErrorDetectionStrategy ;

Ниже приведены некоторые ссылки на сведения об EntLib60.

  • Бесплатная загрузка 2-го издания книги Руководство разработчика по Microsoft Enterprise Library.
  • Рекомендации: в статье Общие рекомендации по повторным попыткам содержится подробное обсуждение логики повторных попыток.
  • Загрузка на сайте NuGet компонента Enterprise Library 6.0: Transient Fault Handling application block

EntLib60: блок ведения журнала

  • Блок ведения журнала — это очень гибкое и настраиваемое решение, которое позволяет выполнять такие действия:
    • создавать и хранить сообщения журнала в разных расположениях;
    • классифицировать и фильтровать сообщения;
    • собирать контекстную информацию, полезную для отладки, трассировки, аудита и выполнения общих требований к ведению журнала.
  • Это решение извлекает функции ведения журнала из расположения журнала, что обеспечивает согласованность кода приложения независимо от расположения и типа хранилища журнала.

Дополнительные сведения см. в статье 5 — As Easy As Falling Off a Log: Using the Logging Application Block (5. Простой вариант: использование решения Logging Application Block).

Исходный код метода EntLib60 IsTransient

Ниже приведен исходный код (на языке C#) метода IsTransient из класса SqlDatabaseTransientErrorDetectionStrategy. Исходный код поясняет, какие ошибки считаются временными и приемлемыми для повторной попытки (версия за апрель 2013 г.).

public bool IsTransient(Exception ex)
{
  if (ex != null)
  {
    SqlException sqlException;
    if ((sqlException = ex as SqlException) != null)
    {
      // Enumerate through all errors found in the exception.
      foreach (SqlError err in sqlException.Errors)
      {
        switch (err.Number)
        {
            // SQL Error Code: 40501
            // The service is currently busy. Retry the request after 10 seconds.
            // Code: (reason code to be decoded).
          case ThrottlingCondition.ThrottlingErrorNumber:
            // Decode the reason code from the error message to
            // determine the grounds for throttling.
            var condition = ThrottlingCondition.FromError(err);

            // Attach the decoded values as additional attributes to
            // the original SQL exception.
            sqlException.Data[condition.ThrottlingMode.GetType().Name] =
              condition.ThrottlingMode.ToString();
            sqlException.Data[condition.GetType().Name] = condition;

            return true;

          case 10928:
          case 10929:
          case 10053:
          case 10054:
          case 10060:
          case 40197:
          case 40540:
          case 40613:
          case 40143:
          case 233:
          case 64:
            // DBNETLIB Error Code: 20
            // The instance of SQL Server you attempted to connect to
            // does not support encryption.
          case (int)ProcessNetLibErrorCode.EncryptionNotSupported:
            return true;
        }
      }
    }
    else if (ex is TimeoutException)
    {
      return true;
    }
    else
    {
      EntityException entityException;
      if ((entityException = ex as EntityException) != null)
      {
        return this.IsTransient(entityException.InnerException);
      }
    }
  }

  return false;
}

Дальнейшие действия

  • Библиотеки подключений для Базы данных SQL и SQL Server
  • Организация пулов соединений (ADO.NET)
  • Retrying — это лицензированная общая библиотека Apache 2.0 для повторных попыток, написанная на языке Python, которая позволяет легко добавить режим повтора куда угодно.

I am having error while connecting to SQL Server:

enter image description here

Details in Stack Trace are:

===================================

Cannot connect to ServerName.

===================================

A connection was successfully established with the server, but then an error occurred during the login process. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.) (.Net SqlClient Data Provider)

------------------------------
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&EvtSrc=MSSQLServer&EvtID=233&LinkId=20476

------------------------------
Server Name: ServerName
Error Number: 233
Severity: 20
State: 0


------------------------------
Program Location:

   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject, Boolean withFailover)
   at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.SqlServer.Management.SqlStudio.Explorer.ObjectExplorerService.ValidateConnection(UIConnectionInfo ci, IServerType server)
   at Microsoft.SqlServer.Management.UI.ConnectionDlg.Connector.ConnectionThreadUser()

NOTE I have tried

  • closing, reopening Sql server Management Studio.

  • closing , reopen VS & rebuild Solution

  • killed worker process accessing database.

  • login credentials are correct.

  • able to ping server to make sure its not down.

«При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен на разрешение удаленных подключений. (Поставщик: поставщик именованных каналов, ошибка: 40 — не удалось открыть соединение с SQL Server) (Microsoft SQL Server, ошибка: 53)».

При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром.

В статье обсуждается подробный список методов устранения неполадок, которые можно использовать для подключения к серверу SQL. Прежде всего, мы обсудим проблемы, которые возникают, когда вам нужно подключиться к удаленному серверу с использованием IP-адреса, так как это наиболее распространенная причина. Эти шаги описаны в «SQL Server 2008 R2» для «Windows 10», но их можно использовать и в других версиях с небольшими изменениями.

Ошибка обычно означает, что «SQL-сервер не найден» или «TCP-порт либо неизвестен, либо неверен», либо он может быть заблокирован «брандмауэром».

Способ 1. Соберите информацию об экземпляре SQL Server.

В этом разделе мы обсудим способы проверки того, работает экземпляр SQL Server или нет, а также методы исправления, если он не работает.

Шаг 1. Проверьте, установлен ли экземпляр SQL Server и работает ли он

Прежде всего, войдите на компьютер, на котором размещен экземпляр SQL-сервера. Теперь выполните следующие действия, чтобы открыть службы в Windows.

  1. Нажмите «Пуск», а затем выберите «Все программы».
  2. Теперь укажите на SQL Server, а затем выберите «Инструменты настройки».
  3. Нажмите «Диспетчер конфигурации SQL Server».
  4. Теперь выберите «Службы SQL Server» и проверьте на правой панели, запущен ли экземпляр ядра базы данных.
  5. Более того, это можно открыть напрямую, набрав «services.msc» в RUN и нажав «ОК». Появится следующий экран.

Открытие служб путем ввода «services.msc» в поле «Выполнить».

Теперь проверьте, настроено ли ядро ​​базы данных для приема удаленных подключений. Чтобы проверить это, выполните следующие действия.

  1. После того, как службы были открыты, вы можете увидеть механизм базы данных на правой панели. «MSSQLSERVER» — это безымянный экземпляр по умолчанию. Экземпляр по умолчанию может быть только один.
  2. В случае «SQL Express» экземпляром по умолчанию будет «SQLEXPRESS», если только он не будет переименован кем-либо во время установки.
  3. Убедитесь, что экземпляр, к которому вы пытаетесь подключиться, имеет то же имя, что и в службах.
  4. Также убедитесь, что экземпляр находится в состоянии «РАБОТАЕТ».
  5. Более того, если вы пытаетесь подключиться к named Instant, дважды проверьте, запущена ли уже «служба браузера SQL Server». Таким образом, вам необходимо проверить, запущена ли «служба обозревателя SQL Server» на сервере, на котором установлен SQL Server.
  6. В случае, если ядро ​​базы данных не запущено, вам необходимо перезапустить его. Итак, чтобы запустить «Ядро базы данных», на правой панели щелкните правой кнопкой мыши «Ядро базы данных» («MSSQLSERVER» по умолчанию), а затем нажмите «Пуск».

Проверьте, запущена ли уже «служба браузера SQL Server».

Шаг 2. Получите IP-адрес компьютера.

Для этого выполните следующие действия.

  1. Прежде всего, в меню «Пуск» нажмите «Выполнить», введите «cmd» и нажмите «ОК».
  2. В окне командной строки введите «ipconfig» и запишите адреса IPV4 и IPV6. Люди в основном используют адрес IPV4.

Получить IPv4-адрес

Шаг 3. Получите номер порта TCP, используемый сервером SQL.

Выполните следующие шаги, чтобы получить номер порта TCP, используемый сервером SQL.

  1. Используя «SQL Server Management Studio» (SSMS), подключитесь к экземпляру SQL-сервера.
  2. В «обозревателе объектов» разверните «Управление», разверните «Журнал SQL-сервера» и щелкните текущий журнал, к которому вы должны применить фильтр.
  3. Чтобы применить фильтр, нажмите «Применить фильтр» и введите «сервер прослушивается» в текстовое поле «Сообщение содержит». Нажмите «Применить фильтр» и нажмите «ОК».

    Применение фильтра «сервер прослушивается»

  4. Сообщение типа «сервер прослушивает [‘any’ <ipv4> 1433]» следует показать. Сообщение показывает, что экземпляр SQL Server прослушивает все компьютеры с IP-адресом IPv4 и TCP-портом 1433 (по умолчанию).
  5. Для более чем одного экземпляра TCP-порт будет другим для каждого экземпляра.

    Сообщение о том, что сервер прослушивает IPv4 и порт 1433

  6. Если это не так, нажмите «Все программы», выберите «Инструменты настройки сервера MS SQL», «Управление конфигурацией сервера SQL», щелкните правой кнопкой мыши «TCPIP» и нажмите «Включить» и перезапустите сервер SQL, чтобы изменения вступили в силу.

Способ 2: Включение протоколов для порта 1433

Подключение к «Ядро базы данных» с другого компьютера не разрешено во многих реализациях «SQL Server», если только администратор не использует «Диспетчер конфигурации», чтобы разрешить это. Для этого необходимо выполнить следующие шаги.

  1. Нажмите «Пуск», а затем выберите «Все программы».
  2. Укажите на «SQL Server 2008 R2».
  3. Укажите на «Инструменты настройки», а затем нажмите «Диспетчер конфигурации SQL Server».
  4. Разверните «Сетевая конфигурация SQL Server».
  5. Выберите «Протоколы для сервера MSSQL». Нажмите «TCPIP» на правой панели.

    Открытие вкладки «Протокол»

  6. Во вкладке «Протокол» установите «Да».
  7. Выберите вкладку «IP-адрес» в окне и установите «TCP-порт» равным «1433» в записи «IP All».

    Установите номер порта на вкладке «IP-адрес».

  8. Теперь перезапустите механизм базы данных, чтобы изменения оставили свой эффект. Для этого на левой панели выберите службы SQL-сервера, а затем на правой панели щелкните правой кнопкой мыши экземпляр ядра базы данных и нажмите «перезапустить».

Способ 3: создать исключение брандмауэра

Иногда включается брандмауэр Windows и блокирует ссылки с другого компьютера. Чтобы исправить это, выполните следующие действия.

  1. Нажмите «Пуск» и начните вводить «Firewall.cpl» в поле «Выполнить».

    Открытие «Firewall.cpl»

  2. Вы получаете «фрейм конфигурации» для брандмауэра Windows, выполнив команду «firewall.cpl». Вы можете включить/выключить брандмауэр с исключениями и другими настройками, применяемыми здесь. Проверьте состояние брандмауэра и включите его, чтобы активировать его, если брандмауэр выключен. Если вы только что включили это, ваш брандмауэр будет блокировать любой запрос на подключение «SQL Server» к вашему компьютеру в этот момент. Сделав определенные исключения, вам потребуется настроить брандмауэр, чтобы разрешить доступ к ядру базы данных SQL Server.
  3. Нажмите «Дополнительные настройки»

    Нажмите на опцию дополнительных настроек, чтобы открыть правила брандмауэра.

  4. Нам нужно узнать о портах, используемых для «SQL Server» и функции «Браузер SQL Server» при работе с конфигурациями брандмауэра «SQL Server». Оба участвуют в настройке «брандмауэра» для «SQL Server». Поэтому было бы необходимо рассмотреть оба понятия по отдельности.
  5. Вы можете разрешить или заблокировать попытки доступа к компьютеру, отвечающие требованиям правила. По умолчанию «входящий трафик» заблокирован, вам необходимо установить «правило для входящего трафика», чтобы разрешить доступ трафика к компьютеру. Нажмите «Правила для входящих подключений» на левой панели «Брандмауэр Windows в режиме повышенной безопасности» и нажмите «Новое правило» в окне «Действия».

    Выбор нового правила в окне «Действия».

  6. Выберите «Порт» в разделе «Тип правила» и нажмите кнопку «Далее».

    Выбор опции «порт»

  7. Теперь выберите «Определенные локальные порты» и установите его на 1433.

    установите «конкретный локальный порт» на 1433

  8. Теперь выберите «Разрешить подключение» в диалоговом окне «Действие» и нажмите кнопку «Далее».

    выбрав «Разрешить подключение»

  9. Дайте правилу «название» на этом этапе и нажмите кнопку «Готово».

    Дайте название правилу

  10. Выберите «Пользовательское правило» на вкладке «Новое правило».

    Выберите «Пользовательское правило» на вкладке «Новое правило».

  11. Нажмите «настроить»

    Нажмите «настроить»

  12. Выберите «Служба экземпляра ядра базы данных» в разделе «Настройка параметров службы» в разделе «Применить к этой службе» и нажмите кнопку «ОК».

    Выберите «Служба экземпляра ядра базы данных» в разделе «Настройка параметров службы» в разделе «Применить к этой службе» и нажмите кнопку «ОК».

  13. Дайте правилу имя и нажмите «Готово».

    Дайте название новому правилу

  14. Также добавьте «sqlservr.exe», обычно расположенный в «C:Program Files (x86)Microsoft SQL ServerMSSQL.xMSSQLBin» (или проверьте фактический путь к папке), к пути, проверьте свои установки на фактическое путь к папке) и порт со значением по умолчанию «1433». Также проверьте строку подключения.

Способ 4: проверьте локальное соединение

Одна из причин этой ошибки заключается в том, что если мы укажем неправильное имя сервера, это приведет к ошибке. Как видно на рисунке ниже, предоставленное имя сервера — «DESKTOP-UD88TLT1», тогда как точное имя сервера — «DESKTOP-UD88TLT». Таким образом, он не сможет подключиться к серверу, что приведет к ошибке «невозможно подключиться к серверу». Это самая основная причина ошибки, поэтому мы должны сначала проверить ее, если работаем локально.

Ошибка возникает при локальном подключении к SQL-серверу с неправильным именем сервера. Если вы используете экспресс-выпуск после имени вашего сервера, добавьте «SQLEXPRESS», как показано на рисунке ниже.

Локальное подключение к SQL-серверу при использовании экспресс-версии

SQL Server — при установлении соединения с sql server произошла ошибка, связанная с сетью или конкретным экземпляром

 Сведения об ошибке или симптомы: не удается подключиться к SQL server, и вы получаете ошибку сетевая ошибка или ошибка конкретного экземпляра произошла при установлении соединения с sql server

Эта ошибка видна в установке SQL Express, так как по умолчанию установлен именованный экземпляр с именем экземпляра как Servername/SQLExpress.

Некоторые другие подобные ошибки:

поставщик: поставщик именованных каналов, ошибка: 40 – не удалось открыть соединение с sql server.

поставщик: сетевые интерфейсы sql, ошибка: 26-ошибка определения местоположения указанного сервера / экземпляра.

Решение:

Если мы подключаемся с Windows PC / Client к Windows server / SQL Server (сервер с установленным SQL Server) и получаем ошибку выше, то нам нужно проверить следующее:

В Windows SQL Server если мы пытаемся подключиться к именованному экземпляру то:

Убедитесь, что запущена служба Windows под названием “браузер SQL Server”.
Убедитесь, что брандмауэр Windows включен для входящего порта UDP 1434
убедитесь, что брандмауэр Windows включен для входящего порта TCP 1433
убедитесь в Диспетчере конфигурации SQL Server, что протокол TCP/IP включен и установлен в значение to 1433(может быть изменен при необходимости)

Кроме того, убедитесь, что

Убедитесь, что ваш компонент database engine настроен на удаленное подключение. Щелкните правой кнопкой мыши на экземпляре, чтобы перейти на страницу свойств и убедиться, что он включен для приема удаленных подключений.

Если мы подключаемся к именованному экземпляру SQL Server, убедитесь, что имя экземпляра в строке подключения указано правильно. Обычно формат, необходимый для указания сервера базы данных, — machinenameinstancename или в строке подключения-правильный формат с правильным именем экземпляра.

Обработка исключений

Подключение к базе данных представляет собой одно из слабых мест в работе программы. В силу самых разных причин клиент может не получить доступ к базе данных. Поэтому при создании приложения следует обязательно включать обработку исключений и возможность предоставления пользователю информации о них.

Для получения специализированных сообщений при возникновении ошибок подключения к базе данных Microsoft SQL Server используются классы SqlException и SqlErro r. Объекты этих классов можно применять для перехвата номеров ошибок, возвращаемых базой данных (таблица 4.2):

Таблица
4.2.
Ошибки SQL Server

Номер ошибки Описание
17 Неверное имя сервера
4060 Неверное название базы данных
18456 Неверное имя пользователя или пароль

Дополнительно вводятся уровни ошибок SQL Server, позволяющие охарактеризовать причину проблемы и ее сложность (таблица 4.3):

Таблица
4.3.
Уровни ошибок SQL Server

Интервал возвращаемых значений Описание Действие
11-16 Ошибка, созданная пользователем Пользователь должен повторно ввести верные данные
17-19 Ошибки программного обеспечения или оборудования Пользователь может продолжать работу, но некоторые запросы будут недоступны. Соединение остается открытым
20-25 Ошибки программного обеспечения или оборудования Сервер закрывает соединение. Пользователь должен открыть его снова

Создайте новое Windows-приложение и назовите его «ExceptionsSQL». Свойству Size формы устанавливаем значение «600;380». Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение «Fill». Перетаскиваем элемент Panel, определяем следующие его свойства:

panel1, свойство Значение
Dock Right
Location 392; 0
Size 200; 346

На панели размещаем четыре текстовых поля, надпись и кнопку:

textBox1, свойство Значение
Name txtDataSource
Location 8; 8
Size 184; 20
Text Введите название сервера
textBox2, свойство Значение
Name txtInitialCatalog
Location 8; 40
Size 184; 20
Text Введите название базы данных
textBox3, свойство Значение
Name txtUserID
Location 8; 72
Size 184; 20
Text Введите имя пользователя
textBox4, свойство Значение
Name txtPassword
Location 8; 104
Size 184; 20
Text Введите пароль1Для скрывания пароля при вводе можно в свойстве «PasswordChar» текстового поля ввести заменяющий символ, например, звездочку («*»).
label1, свойство Значение
Location 16; 136
Size 176; 160
Text
button1, свойство Значение
Name btnConnect
Location 56; 312
Size 96; 23
Text Соединение

Интерфейс приложения готов. Подключаем пространство имен для работы с базой данных:

using System.Data.SqlClient;

Объекты ADO .NET и весь блок обработки исключений помещаем в обработчик кнопки «Соединение»:

private void btnConnect_Click(object sender, System.EventArgs e)
{
	SqlConnection conn = new SqlConnection();
	label1.Text = "";
	try
	{
//conn.ConnectionString = "workstation id=9E0D682EA8AE448;data source="(local)
//";" + "persist security info=True;initial catalog=Northwind;
//user id=sa;password=12345";

//Строка ConnectionString в качестве параметров 
//будет передавать значения, введенные в текстовые поля:
		conn.ConnectionString = 
		"initial catalog=" + txtInitialCatalog.Text + ";" +
		"user id=" + txtUserID.Text + ";" +
		"password=" + txtPassword.Text + ";" +
		"data source=" + txtDataSource.Text + ";" +
		"workstation id=9E0D682EA8AE448;persist security info=True;";
		SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM 
		 Customers", conn);
		DataSet ds = new DataSet();
		conn.Open();
		dataAdapter.Fill(ds);
		dataGrid1.DataSource = ds.Tables[0].DefaultView;
	}
	catch (SqlException OshibkiSQL)
	{
		foreach (SqlError oshibka in OshibkiSQL.Errors)
		{
			//Свойство Number объекта oshibka возвращает 
			//номер ошибки SQL Server
			switch (oshibka.Number)
			{
			case 17:
			label1.Text += "nНеверное имя сервера!";
			break;
			case 4060:
			label1.Text += "nНеверное имя базы данных!";
			break;
			case 18456:
			label1.Text += "nНеверное имя пользователя или пароль!";
			break;
			}
			//Свойство Class объекта oshibka возвращает 
			//уровень ошибки SQL Server,
			//а свойство Message - уведомляющее сообщение
			label1.Text +="n"+oshibka.Message + "
			 Уровень ошибки SQL Server: " + oshibka.Class;			}
	}
	//Отлавливаем прочие возможные ошибки:
	catch (Exception ex)
	{
		label1.Text += "nОшибка подключения: " + ex.Message;
	}
	finally
	{
		conn.Dispose();
	}
}

Закомментированная строка подключения содержит обычное перечисление параметров. При отладке приложения будет легче сначала добиться наличия подключения, а затем осуществлять привязку параметров, вводимых в текстовые поля. Запускаем приложение. При вводе неверных параметров в надпись выводятся соответствующие сообщения, а при правильных параметрах элемент DataGrid отображает данные (рис. 4.11):

В программном обеспечении к курсу вы найдете приложение Exceptions SQL (CodeGlava2 ExceptionsSQL).

Скопируйте папку приложения ExceptionsSQL и назовите ее «ExceptionsMDB». Удаляем с панели на форме имеющиеся текстовые поля и добавляем три новых:

textBox1, свойство Значение
Name txtDataBasePassword
Location 8; 16
Size 184; 20
Text Введите пароль базы данных
textBox2, свойство Значение
Name txtUserID
Location 8; 48
Size 184; 20
Text Введите имя пользователя
textBox3, свойство Значение
Name TxtPassword
Location 8; 80
Size 184; 20
Text Введите пароль пользователя

Изменяем пространство имен для работы с базой данных:

Обработчик кнопки «Соединение» будет выглядеть так:

private void btnConnect_Click(object sender, System.EventArgs e)
{
	OleDbConnection conn = new OleDbConnection();
	label1.Text = "";
	try
	{
// conn.ConnectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0"";
//Data Source=""D:UchebnikCodeGlava2BDwithUsersP.mdb"";
Jet OLEDB:System database=""D:UchebnikCodeGlava2BDWorkFile.mdw"";
User ID=Adonetuser;Password=12345;Jet OLEDB:Database Password=98765;";
				
//Строка ConnectionString в качестве параметров 
//будет передавать значения, введенные в текстовые поля:
		conn.ConnectionString = 
		"Jet OLEDB:Database Password=" + txtDataBasePassword.Text 
		 + ";" + "User ID=" + txtUserID.Text + ";" +
		 "password=" + txtPassword.Text + ";" +

				@"Provider=""Microsoft.Jet.OLEDB.4.0"";Data 		
	Source=""D:UchebnikCodeGlava2BDwithUsersP.mdb"";
Jet OLEDB:System database=""D:UchebnikCodeGlava
BDWorkFile.mdw"";";

		OleDbDataAdapter dataAdapter = 
		 new OleDbDataAdapter("SELECT * FROM Туристы", conn);
		DataSet ds = new DataSet();
		conn.Open();
		dataAdapter.Fill(ds);
		dataGrid1.DataSource = ds.Tables[0].DefaultView;
	}
	catch (OleDbException oshibka)
	{
		//Пробегаем по всем ошибкам
		for (int i=0; i < oshibka.Errors.Count; i++)
		{
			label1.Text+= "Номер ошибки " + i 
			 + "n" + "Сообщение: " + 
			 oshibka.Errors[i].Message + "n" +
			 "Номер ошибки NativeError: " + 
			 oshibka.Errors[i].NativeError + "n" +
			 "Источник: " + oshibka.Errors[i].Source + 
			 "n" + "Номер SQLState: " + 
			 oshibka.Errors[i].SQLState + "n";
			}
		}
		//Отлавливаем прочие возможные ошибки:
		catch (Exception ex)
		{
			label1.Text += "nОшибка подключения: " + 
			 ex.Message;
		}
		finally
		{
			conn.Dispose();
		}
}

Запускаем приложение (рис. 4.12). Свойство Message возвращает причину ошибки на русском языке, поскольку установлена русская версия Microsoft Office 2003. Свойство NativeError (внутренняя ошибка) возвращает номер исключения, генерируемый самим источником данных. Вместе или по отдельности со свойством SQL State их можно использовать для создания переключателя, предоставляющего пользователю расширенную информацию (мы это делали в приложении ExceptionsSQL) .

 Готовое приложение ExceptionsMDB

Рис.
4.12.
Готовое приложение ExceptionsMDB

Кроме обработки исключений, здесь следует обратить внимание на интерфейс, предоставляющий возможность пользователю вводить сведения своей учетной записи. Теперь в целях безопасности приложения не нужно включать пароль в код при использовании мастеров, поскольку строка соединения будет генерироваться динамически. Разумеется, ваше приложение может иметь другой интерфейс — например, окно соединения будет появляться в дочерней форме.

В программном обеспечении к курсу вы найдете приложение Exceptions MDB (CodeGlava2 ExceptionsMDB).

Понравилась статья? Поделить с друзьями:
  • Sql при выполнении текущей команды возникла серьезная ошибка
  • Sql server проверка на ошибку
  • Sql ошибка таблицы не существует
  • Sql server ошибка соединения hresult 80004005
  • Sql ошибка субд журнал транзакций переполнен