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

时间:2020-01-21 20:38:11

标签: c# asp.net sql-server asp.net-core windows-server-2019

我在Server 2008计算机上有许多.NET Web应用程序,我正尝试迁移到Server 2019计算机,其中一些使我在移动它们后连接到另一台服务器上的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服务器软件包安装在服务器上)的连接字符串就像 “服务器= mysqlserver \ myinstance,3050;数据库=想法; Trusted_Connection =真;” 并且正在使用Entity Framework / DbContext进行连接。

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

从新的应用服务器到数据库服务器的ping操作有效。在新服务器上以域用户身份运行SSMS可以很好地连接数据库,并可以通过Management Studio查看数据。

所以我不知道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 Server实例还有更多关系。同样,来自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 server不存在的原因。 我在任何编辑器中都看不到它们,只能通过VS Code找到它,然后比较说这行是不同的,但是看不到任何区别,我把它分成几块,找到了位置。在写字板中打开它时,我们发现它是唯一显示它的地方,请参见下文。 enter image description here

4 个答案:

答案 0 :(得分:5)

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

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

请参阅以下问题question1question2

“指定端口时无需指定实例名称。”

答案 1 :(得分:5)

问题归因于连接字符串中的隐藏字符。参见我的编辑4。剩余的其他问题无关。

答案 2 :(得分: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“

答案 3 :(得分:0)

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

无法使用System.Data.SqlClient连接到 MySQL 数据库-它是为 SQL 数据库而不是< strong> MySQL

您可以找到 MySQL 数据连接器Here.(也可以从Nuget下载)

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


下载软件包后,您可以在 Solution Explorer 中右键单击References项目,然后单击Add Reference...-将其添加为项目中的参考。 参考管理器窗口将打开。单击左侧菜单中的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!");
    }

(代码/部分答案来自here.

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