点网核心–如何解决:MSSQL 2017超时错误(.Net 4.7.1不会发生)

时间:2019-06-19 08:21:48

标签: c# .net-core sqlconnection

无法从dotnet core 2.2控制台应用程序连接到MS SQL Server 2017 Express。

检查服务器配置,如Connection to SQL Server Works Sometimes

我已经安装了新的Microsoft SQL Server 2017 Express。然后使用控制台应用程序(在.Net Framework 4.7.1下)测试与该服务器的连接。可以!

然后,我在Dot Net Core 2.2下创建了一个控制台应用程序。安装了NuGet包System.Data.SqlClient并尝试使用我之前测试过的相同连接字符串连接到sql服务器,并收到超时错误。如何解决? (我还使用了包Microsoft.Data.SqlClient,结果相同。)

如果我尝试连接到另一个SQL Server(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 :(得分:0)

通过在连接字符串的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();

答案 1 :(得分:0)

尝试捕获SQLServer超时异常:

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

这可能会timeout

答案 2 :(得分:0)

要为SQLExpress启用远程访问,您必须Configure Express to accept remote connections

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;