Dot net Core - Как исправить: TimeOut-Error для MSSQL 2017 (чего не происходит с .Net 4.7.1) - PullRequest
1 голос
/ 19 июня 2019

Не удается подключиться к MS SQL Server 2017 Express из консольного приложения dotnet core 2.2.

Проверка конфигурации сервера, как в Подключение к SQL Server работает Иногда

Я установил новый Microsoft SQL Server 2017 Express.Затем протестировал соединение с этим сервером с помощью консольного приложения (в .Net Framework 4.7.1).Работает!.

Затем я создал консольное приложение под Dot Net Core 2.2.Установил пакет NuGet System.Data.SqlClient и попытался подключиться к серверу sql, используя ту же строку подключения, которую я тестировал ранее, и получил ошибку тайм-аута.Как это можно исправить?(Я также использовал пакет Microsoft.Data.SqlClient с тем же результатом.)

Если я пытаюсь подключиться к другому SQL-серверу (2008), соединение устанавливается без проблем.

using System;
using System.Data.SqlClient;

namespace ConsoleClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Connecting");

            using (var conn = new SqlConnection(@"server=<IP>\SQLEXPRESS;user id=sa;password=<PASSWORD>;database="))
            {
                Console.WriteLine("Try to open connection");

                conn.Open();

                Console.WriteLine("Connection opened");
            }
            Console.ReadLine();
        }
    }
}

Произошло следующее исключение:

Microsoft.Data.SqlClient.SqlException: 'Connection Timeout Expired.  The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement.  This could be because the pre-login handshake failed or the server was unable to respond back in time.  The duration spent while attempting to connect to this server was - [Pre-Login] initialization=21064; handshake=50; '

Ответы [ 3 ]

0 голосов
/ 25 июня 2019

попытаться перехватить исключения тайм-аута SQLServer:

      try
        {
            // some code
        }
        catch (SqlException ex) when (ex.Number == -2)  // -2 is a sql timeout
        {
            // handle timeout
        }

это может помочь тайм-аут

0 голосов
/ 25 июня 2019

Чтобы включить удаленный доступ для SQLExpress, необходимо Настроить Express для приема удаленных подключений

В ConnectionString:

  1. нужен порт для SQLExpressсервер.
  2. параметр database не должен быть пустым.

Если все настроено правильно, проще всего исправить timeout:

dbConnection.ConnectionTimeout = 0;

это позволит ADO.NET снова и снова пытаться / ждать до тех пор, пока он действительно не выйдет из строя.

Вот хороший пример:

Server=sampleServer\SQLEXPRESS,samplePort;Database=sampleDB;Persist Security Info=True;User ID=sa;Password=12345678;
0 голосов
/ 19 июня 2019

Принудительное использование именованных каналов, указав квалификатор np: в параметре server в строке подключения, выполняет работу.


Console.WriteLine("Connecting");

using (var conn = new SqlConnection(@"server=np:<IP>\SQLEXPRESS;user id=sa;password=<PASSWORD>;database="))
{
    Console.WriteLine("Try to open connection");

    conn.Open();

    Console.WriteLine("Connection opened");
}
Console.ReadLine();

...