10

我正在尝试迁移到 Server 2019 机器的 Server 2008 机器上有许多 .NET Web 应用程序,其中一些在移动它们后给我连接到另一台服务器上的 SQL Server 2016 实例的问题。

我得到的错误是

System.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:SQL 网络接口,错误:25 - 连接字符串无效)---> System.ComponentModel.Win32Exception (87):参数不正确

这是一个 .NET Core 2.2 Web 应用程序。(安装在服务器上的.net core 2.2 服务器包)连接字符串类似于“Server=mysqlserver\myinstance,3050;Database=Idea;Trusted_Connection=True;” 并且正在使用 Entity Framework/DbContext 进行连接。

IIS 中的应用程序为此应用程序创建了一个应用程序池,设置与在旧服务器上运行的相同:无托管代码,身份设置为域用户“域\用户”。

从新的应用程序服务器 ping 到数据库服务器工作正常。在新服务器上以域用户身份运行 SSMS 可以正常连接数据库,并且可以通过管理工作室查看数据。

所以我不知道 Server 2019 在尝试连接 SQL Server 的方式上是否有什么不同?几天来我一直在努力解决这个问题。.NET 4.0 应用程序在尝试连接到同一实例上的其他数据库时也会遇到相同的错误。

奇怪的是,其他一些应用程序工作正常,连接到不同服务器上的不同 SQL 2016 实例,但它们也是不同的 .net 版本,如较旧的 .NET 4.0 Web 应用程序,但它们作为具有不同域的应用程序池运行占每个应用程序罚款。

似乎此服务器上的所有 .NET Core 或 .net 4.0 Web 应用程序都无法从该服务器连接到这个数据库实例,但在旧的 Web 应用程序服务器上它们工作正常。

还有什么我可以检查的想法吗?

编辑:我发现错误实际上是在连接到新的 SQL Server 时,即使从旧的应用程序服务器它仍然会收到相同的错误。我在这个应用程序中有 2 个连接,所以我以为是第一个,但实际上是第二个。所以这更多地与新的 SQL 服务器实例有关。同样,来自 SSMS 的连接适用于此用户,但不适用于 Web 应用程序。

编辑 2:经过更多测试,如果有 Server 2019 混合使用,那肯定是可以做的。从 2019 应用服务器到 2019 数据库服务器失败。从 2008 应用服务器到 2019 数据库服务器失败。从 2019 应用服务器到 2016 数据库服务器失败。从 2008 应用服务器到 2016 数据库服务器成功。

编辑3:我觉得我在这里要疯了。其中一个应用程序,我尝试将 ASPNETCORE_ENVIRONMENT 更改为 Development 以便我可以在屏幕上看到更详细的错误,因此我将 appsettings.Development.json 设置为与 appsettings.Production.json 完全相同,然后连接正常!将其切换回生产环境再次出现错误。整个文件是完全相同的文本。这有什么意义呢?我什至尝试将环境变量显式设置为生产,而不是让它作为默认设置。

编辑4:我已经解决了我现在遇到的一半问题。无论出于何种原因,我一开始从其中一个电子表格中复制的连接字符串中包含疯狂的隐藏字符,这就是为什么它说 sql server 不存在的原因。我在任何编辑器中都看不到它们,只有通过 VS Code 比较发现它说行不同但没有看到任何差异,我将它分成块并找到了位置。当我们在写字板中打开它时,我们发现这是唯一会显示它的地方,见下文。 在此处输入图像描述

4

4 回答 4

5

我相当确定解决方案是从连接字符串中删除实例名称......

"Server=mysqlserver,3050;Database=Idea;Trusted_Connection=True;"

参考这些问题question1 & question2

“指定端口时不必指定实例名称。”

于 2020-01-21T21:01:07.680 回答
5

问题是由于连接字符串中的隐藏字符。请参阅我的编辑 4。剩下的其他问题无关紧要。

于 2020-01-30T15:28:34.893 回答
0

尝试使用与在 IIS 中配置应用程序相同的 AppPool 名称在数据库中创建用户。

这是在数据库中创建用户的“如何”: https ://engram404.net/grant-sql-permissions-to-iis-apppool-user/

它对我有用。

否则,这是发生的“原因”:您在 connectionString 中告诉它将使用受信任的连接"Trusted_Connection=True;"

如果您不想像前面描述的那样创建用户,您应该删除Trusted_Connection=True;并使用您的连接字符串,如下所示:

Server=mysqlserver\myinstance,3050;Database=Idea;User Id=SetYourUser;Password=SetYourPassword"

于 2020-01-28T20:23:41.633 回答
0

我知道你碰巧解决了这个问题,但仍然..

无法连接到MySQL数据库System.Data.SqlClient- 它是为SQL数据库配置的,而不是MySQL

您可以在此处找到MySQL数据连接器。(您也可以从Nuget下载它)

如果您是从Nuget下载的,请跳过此步骤。


下载包后,您可以将其作为参考添加到项目中,方法是右键单击解决方案资源管理器References中的项目,然后单击-参考管理器窗口将打开。单击左侧菜单中的项目,然后单击按钮,然后导航到保存包的目录。Add Reference...BrowseBrowse


现在,在成功下载并安装包后,将此行添加到您的代码中:

using MySql.Data.MySqlClient;

使用 连接到MySQL数据库的正确语法MySql.Data.MySqlClient;是:

string connectionInfo = @"Server=localhost;Database=your_database;User ID=root;Password=123456";

因此,总体而言,您的代码如下所示:

    using(MySqlConnection con = new MySqlConnection(connectionInfo))
    {
        con.Open();
        MessageBox.Show("Successful Connection!");
    }

(代码/部分答案来自这里。

我希望我可以帮助其他人解决这个问题:)

于 2020-02-04T02:23:35.257 回答