SQL 将 .net 应用程序移动到新服务器时出现服务器连接错误

SQL Server connection errors when moving .net app to new server

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

我得到的错误是

System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 25 - Connection string is not valid) ---> System.ComponentModel.Win32Exception (87): The parameter is incorrect

这是一个 .NET Core 2.2 网络应用程序。 (服务器上安装的.net core 2.2服务器包)连接字符串就像 "Server=mysqlserver\myinstance,3050;Database=Idea;Trusted_Connection=True;" 并且正在使用实体 Framework/DbContext 进行连接。

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

从新的应用服务器向数据库服务器执行 Ping 操作。 运行 SSMS 作为新服务器上的域用户可以正常连接到数据库,并且可以通过 Management Studio 查看数据。

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

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

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

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

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

Edit2:经过更多测试,如果混合使用 Server 2019,那肯定是可以做的。从 2019 年应用服务器到 2019 年数据库服务器出现故障。从 2008 年应用服务器到 2019 年数据库服务器出现故障。从 2019 年应用服务器到 2016 年数据库服务器出现故障。从 2008 年应用服务器到 2016 年数据库服务器成功。

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

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

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

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

参考这些问题 & question2

"It's not necessary to specify an instance name when specifying the port."

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

这里是 "how to" 在数据库中创建用户: https://engram404.net/grant-sql-permissions-to-iis-apppool-user/

它对我有用。

否则会发生 "why": 您在 connectionString 中告知它将使用受信任的连接 "Trusted_Connection=True;"

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

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

问题是由于连接字符串中的隐藏字符造成的。请参阅我的编辑 4。遗留的其他问题无关。

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

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

您可以找到 MySQL 数据连接器 Here. (You can otherwise download it from Nuget)

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


下载包后,您可以将其添加为项目中的引用,方法是右键单击 Solution Explorer 中的 References 项,然后单击 Add Reference... - 引用管理器 window 将打开。单击左侧菜单中的 Browse 项,然后单击 Browse 按钮,然后导航到保存包的目录。


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

using MySql.Data.MySqlClient;

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

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

因此,总的来说,您的代码如下所示:

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

(代码/部分答案来源于)

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