【问题标题】:.NET Core can't connect to remote SQL Server database.NET Core 无法连接到远程 SQL Server 数据库
【发布时间】:2020-09-28 04:29:33
【问题描述】:

我有一个 .NET Core 应用程序作为 API。我可以将它连接到本地 SQL Server 数据库,但不能连接到我网络上的其他数据库。

当我尝试使用 dbContext 访问远程数据库时,我收到此错误:

System.Data.SqlClient.SqlException
建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:26 - 错误定位服务器/指定实例)

appsettings.json 本地:

  "ConnectionStrings": {
    "DefaultConnection": "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=ib;Integrated Security=True;"
  }

appsettings.json 远程:

  "ConnectionStrings": {
    "DefaultConnection": "Server=[servername]\[instanz];Database=IBCore_Lange;User Id=sa;password=XXX"
  }

我可以通过 SQL Server Management Studio 或我系统的先前 (ASP.NET) 版本访问数据库。在 Core 中,我只能访问本地数据库。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

    services.AddDbContext<ibContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}

DbContext 已生成:

Scaffold-DbContext "Connection String"
         Microsoft.EntityFrameworkCore.SqlServer -Verbose -o {output folder} -t {table to update} -force

【问题讨论】:

  • 使用 SQL Server Management Studio 并尝试连接到服务器。 SSMS 登录窗口上的服务器/实例应与连接字符串匹配。您有 Integrated Security=True 这意味着您正在使用当前用户的窗口凭据。需要设置数据库安全设置以允许用户连接的用户组。通常您将数据库设置为 Windows 用户组,然后将所有用户放入该组。该组必须在本地和远程计算机上设置(或在公司网络中使用组策略)。
  • 我可以使用 Integrated Security=True 和 False 访问本地数据库。只有远程数据库有网络相关或特定于实例的错误
  • 你是从旧的 asp.net 版本中复制了 Connectionstring 还是重新写下来了?
  • 我希望我没有正确理解第一条评论。假设他在谈论不同的应用程序用户,我不同意将 Windows 应用程序用户添加到一个组中。我有许多数据库的 sql 实例,应用程序只需要访问它们各自的数据库。我遵循最小权限的概念来防止不必要的访问。您使用的登录名将需要访问它所需的资源,而不是其他任何东西。我不会将不同应用程序的用户放在同一个组中并授予一揽子权限。
  • “网络相关实例”错误不会由身份验证问题产生......关于集成安全性的 cmets 是红鲱鱼

标签: c# sql-server .net-core


【解决方案1】:

尝试以下操作:

  1. 确保通过 SQL Server 配置管理器启用 TCP/IP 协议。另外,请确保未配置自定义端口,for detailed info
  2. 在远程主机的命令提示符下执行telnet HC-SERVER-04 1433(从您尝试连接 SQL 服务器的位置)

如果步骤 2 失败:在 SQL Server 的防火墙中使用端口#14331434 创建规则以接受传入连接,然后重试 telnet,如果 telnet 正常,应用程序应该是可以连接

  1. 如果进入防火墙后不起作用:重启SQL Browser服务
  2. SQL Browser 服务不走运,更改连接字符串如下:
Server=HC-SERVER-04,1433;Database=IBCore_Lange;User Id=sa;password=XXX

【讨论】:

  • 没有配置管理器,但我确信这不是错误。我可以使用连接字符串中没有“1433”的其他应用程序访问远程数据库
  • 其他应用程序(正在工作)是否在同一个子网/VLAN 上?我仍然怀疑 SQL 协议或与网络相关的阻塞问题,因为错误清楚地表明(问题中的第一个错误)。我同意,没有1433 也可以,但SQL Browser service 必须在安装了SQL Server 的地方运行。
  • 将端口号添加到服务器名称解决了我的问题。它浪费了我 5 个小时 :(。例如“Server=SERVER01\\SQLSERVER,1433;Database=DBName;User Id=ABC;Password=IXYZ;MultipleActiveResultSets=True;”。要配置端口,请遵循stackoverflow.com/a/57448109/9522887
  • @KishanVaishnav,我很高兴它有所帮助。但是,在连接字符串中使用端口时,不需要实例名称,即 SERVER01,1433 而不是 SERVER01\\SQLSERVER,1433
【解决方案2】:

在 json 文件中,放双 \\ 像 "DefaultConnection": "Data Source=db-name\\test2019; ...

【讨论】:

    【解决方案3】:

    这里的问题是服务器“Server=[servername]\[instanz]”的命名实例。 我可以在没有实例的情况下连接到 SQL-Server。

    我还没有找到带有命名实例的服务器的解决方案。

    【讨论】:

    • 正如我的回答中提到的,您必须确保 SQL Browser 服务正在运行并在防火墙处启用 UDP:1434。或为命名实例使用自定义端口
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2021-07-15
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多