Время ожидания соединения с SQL Server C#

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

У меня есть экземпляр SQL Server 2008, работающий на сетевом компьютере, и клиент, к которому я написал, подключается к нему.

Для подключения у меня есть небольшой сегмент кода, который устанавливает соединение с экземпляром SQL Server 2008 и возвращает DataTable, заполненный результатами любого запроса, который я запускаю к ​​серверу, на самом деле все довольно стандартные вещи. В любом случае, проблема заключается в том, что всякий раз, когда я открываю свою программу и вызываю этот метод, при первом вызове моего метода, независимо от того, что я установил значение времени ожидания подключения, как в строке подключения, это занимает около 15 секунд, а затем время ожидания, Как ни странно, второй или третий вызов, который я сделаю для метода, будет работать без проблем.

Я открыл порты для SQL Server на сервере, как описано в этой статье: Как открыть порты брандмауэра для SQL Server и проверил, что он правильно настроен. Кто-нибудь может увидеть конкретную проблему в моем коде?

    string _connectionString = "Server=" + @Properties.Settings.Default.sqlServer + "; Initial Catalog=" + @Properties.Settings.Default.sqlInitialCatalog +
        ";User Id=" + @Properties.Settings.Default.sqlUsername + ";Password=" + @Properties.Settings.Default.sqlPassword + "; Connection Timeout=1";

    private DataTable ExecuteSqlStatement(string command)
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            try
            {
                conn.Open();
                using (SqlDataAdapter adaptor = new SqlDataAdapter(command, conn))
                {
                    DataTable table = new DataTable();
                    adaptor.Fill(table);
                    return table;
                }
            }
            catch (SqlException e)
            {
                throw e;
            }
        }
    }

Исключение SqlException, обнаруженное при моем перехвате: "Истекло время ожидания. Время ожидания истекло до завершения операции, или сервер не отвечает".

Это происходит в conn.Open (); строка во фрагменте кода, который я включил. Если у кого-то есть идеи, это было бы здорово!

Приложение Если я пингую сервер, время ответа <10 мс. Кроме того, я получаю такое же поведение при использовании SQL Server Management studio (я только что попробовал это после написания этого вопроса, так как мысль только что пришла мне в голову). Я бы предположил, что это должно быть проблемой сети, а не проблемой кода, поскольку при использовании студии SQL Server Management также требуется две попытки. Я понимаю, что могу реализовать проверку ошибок при сбое подключения, а затем повторить попытку подключения (вероятно, мне следует это сделать в любом случае), но это не кажется мне особенно "чистым", поскольку не решает основную проблему. У кого-нибудь здесь есть опыт решения этой проблемы?

Редактировать Хотя более года спустя этот вопрос просматривали более 4000 раз, с тех пор я обнаружил, что хотя я / думал / порты брандмауэра были открыты, на самом деле это не так. Я неправильно предположил, что вам нужно открыть брандмауэр в Windows для номера порта, который использует SQL Server, в моем случае я настроил его на разрешение подключений через TCP-порт 1433, брандмауэр вызывал проблемы при попытке установить начальное соединение.

Я обнаружил, что правильным способом его настройки было настроить брандмауэр Windows, чтобы разрешить выполнение исполняемого файла экземпляра SQL Server. Для этого вам нужно добавить программу в брандмауэр Windows, перейдите в папку, в которой находится экземпляр SQL, например, C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLINSTANCE\MSSQL\Binn а затем добавьте файл sqlservr.exe в правила брандмауэра.

1 ответ

Решение

Вы устанавливаете значение тайм-аута соединения на 1 секунду. Удалите его из строки подключения и попробуйте снова.

Или проблема может быть связана с выбором SQL, который вы используете. Может ли это занять много времени? Если это так, 2-й и 3-й вызовы будут извлекать кэшированные значения и, таким образом, будут выполняться намного быстрее.

Другие вопросы по тегам