SqlConnection 在 .NET Core 3.1 上打开失败,在 4.6.1 Framework 上打开成功
SqlConnection Fails to Open on .NET Core 3.1 but Succeeds on 4.6.1 Framework
我创建了两个示例 C# 控制台应用程序,一个 运行ning 在 .NET Framework 4.6.1 上,另一个 运行ning .NET Core 3.1。两个应用都与 Program.cs 的以下代码相同:
using System;
using Microsoft.Data.SqlClient;
namespace DBConnectTest
{
class Program
{
static void Main(string[] args)
{
string connStr;
Console.WriteLine("Type Connection String: ");
connStr = Console.ReadLine();
using (SqlConnection connection = new SqlConnection(connStr))
{
SqlCommand sqlCommand = new SqlCommand("SELECT 'Hello' UNION SELECT 'World';", connection);
sqlCommand.Connection.Open();
sqlCommand.ExecuteNonQuery();
}
Console.WriteLine("Succeeded! Done.");
Console.Read();
}
}
}
注意 1:为了保持一致性,我在两个项目上都使用了 nuget 包 Microsoft.Data.SqlClient。
对于输入,我会 copy/paste 一个连接字符串。示例:
Data Source=UATSOMEENV01;Initial Catalog=SomeDB_Name;Persist Security Info=True;Integrated Security=SSPI;App=SampleApp
注意 2:SQL 服务器不是本地服务器 运行 应用程序。
这里是有趣的地方。我 运行 .NET Framework 4.6.1 App 可执行文件,它可以很好地连接到数据库。
但是,当我 运行 .NET Core 3.1 App 可执行文件时,它无法打开与数据库的连接。这是错误消息:
Core-Error-JPEG
我在互联网上阅读了很多关于连接数据库的其他问题,但似乎始终无法正确获取连接字符串。在这种情况下,我知道它是正确的,因为它适用于 4.6.1(除非 .NET Core 期望它不同)。
其他值得注意的项目:
- 作为替代方案,我从成功连接的 .udl 文件生成了连接字符串。但是,这在 运行 .NET Core 3.1 可执行文件时也不起作用。
- 连接字符串中引用的数据库服务器是 AON 集群上的 MSSQL 服务器。
- 使用 Sql 服务器身份验证(sa 帐户)而不是 Windows 连接字符串身份验证输出相同的行为。
- 运行 来自本地数据库服务器的应用程序适用于两个应用程序。即:当可执行文件是 运行 来自数据库服务器的本地时,使用以下连接字符串有效:
Data Source=localhost;Initial Catalog=SomeDB_Name;Persist Security Info=True;Integrated Security=SSPI;App=SampleApp
如有任何帮助,我们将不胜感激。提前致谢!
检查您的 sql 客户端版本与 .NET 3.1 的兼容性
那里一定有问题。
您需要更旧的 sql 连接客户端才能匹配您的 .NET 核心 3.1
经过一些调查和阅读,我发现我必须在连接字符串中添加一个端口号才能使其正常工作。从以前开始,但没有用:
Data Source=UATSOMEENV01;Initial Catalog=SomeDB_Name;Persist Security Info=True;Integrated Security=SSPI;App=SampleApp
工作连接字符串:
Data Source=UATSOMEENV01,6000;Initial Catalog=SomeDB_Name;Persist Security Info=True;Integrated Security=SSPI;App=SampleApp
如果您不确定要使用哪个端口号,请尝试 6000 或 1433 - 如果没有另外设置,这些似乎是常用端口号。如果这些都不起作用,请尝试以下步骤来验证您的数据库正在使用哪个端口号:
- 打开SQL服务器配置管理器(在数据库所在的SQL服务器上)。
- 左窗格,展开SQL服务器网络配置。
- Select MSSQLSERVER 协议。您的 SQL 服务器名称可能不同。
- 右窗格,right-click 在 TCP/IP 和 select Properties.
- 转到 IP 地址 选项卡并滚动到底部。
- 在IPAll下,您要查找的端口号是TCP端口.
的值
一些有用的进一步阅读链接:
Unable to create connectionstring for a remote desktop for a C# application
我创建了两个示例 C# 控制台应用程序,一个 运行ning 在 .NET Framework 4.6.1 上,另一个 运行ning .NET Core 3.1。两个应用都与 Program.cs 的以下代码相同:
using System;
using Microsoft.Data.SqlClient;
namespace DBConnectTest
{
class Program
{
static void Main(string[] args)
{
string connStr;
Console.WriteLine("Type Connection String: ");
connStr = Console.ReadLine();
using (SqlConnection connection = new SqlConnection(connStr))
{
SqlCommand sqlCommand = new SqlCommand("SELECT 'Hello' UNION SELECT 'World';", connection);
sqlCommand.Connection.Open();
sqlCommand.ExecuteNonQuery();
}
Console.WriteLine("Succeeded! Done.");
Console.Read();
}
}
}
注意 1:为了保持一致性,我在两个项目上都使用了 nuget 包 Microsoft.Data.SqlClient。
对于输入,我会 copy/paste 一个连接字符串。示例:
Data Source=UATSOMEENV01;Initial Catalog=SomeDB_Name;Persist Security Info=True;Integrated Security=SSPI;App=SampleApp
注意 2:SQL 服务器不是本地服务器 运行 应用程序。
这里是有趣的地方。我 运行 .NET Framework 4.6.1 App 可执行文件,它可以很好地连接到数据库。 但是,当我 运行 .NET Core 3.1 App 可执行文件时,它无法打开与数据库的连接。这是错误消息:
Core-Error-JPEG
我在互联网上阅读了很多关于连接数据库的其他问题,但似乎始终无法正确获取连接字符串。在这种情况下,我知道它是正确的,因为它适用于 4.6.1(除非 .NET Core 期望它不同)。
其他值得注意的项目:
- 作为替代方案,我从成功连接的 .udl 文件生成了连接字符串。但是,这在 运行 .NET Core 3.1 可执行文件时也不起作用。
- 连接字符串中引用的数据库服务器是 AON 集群上的 MSSQL 服务器。
- 使用 Sql 服务器身份验证(sa 帐户)而不是 Windows 连接字符串身份验证输出相同的行为。
- 运行 来自本地数据库服务器的应用程序适用于两个应用程序。即:当可执行文件是 运行 来自数据库服务器的本地时,使用以下连接字符串有效:
Data Source=localhost;Initial Catalog=SomeDB_Name;Persist Security Info=True;Integrated Security=SSPI;App=SampleApp
如有任何帮助,我们将不胜感激。提前致谢!
检查您的 sql 客户端版本与 .NET 3.1 的兼容性 那里一定有问题。 您需要更旧的 sql 连接客户端才能匹配您的 .NET 核心 3.1
经过一些调查和阅读,我发现我必须在连接字符串中添加一个端口号才能使其正常工作。从以前开始,但没有用:
Data Source=UATSOMEENV01;Initial Catalog=SomeDB_Name;Persist Security Info=True;Integrated Security=SSPI;App=SampleApp
工作连接字符串:
Data Source=UATSOMEENV01,6000;Initial Catalog=SomeDB_Name;Persist Security Info=True;Integrated Security=SSPI;App=SampleApp
如果您不确定要使用哪个端口号,请尝试 6000 或 1433 - 如果没有另外设置,这些似乎是常用端口号。如果这些都不起作用,请尝试以下步骤来验证您的数据库正在使用哪个端口号:
- 打开SQL服务器配置管理器(在数据库所在的SQL服务器上)。
- 左窗格,展开SQL服务器网络配置。
- Select MSSQLSERVER 协议。您的 SQL 服务器名称可能不同。
- 右窗格,right-click 在 TCP/IP 和 select Properties.
- 转到 IP 地址 选项卡并滚动到底部。
- 在IPAll下,您要查找的端口号是TCP端口. 的值
一些有用的进一步阅读链接:
Unable to create connectionstring for a remote desktop for a C# application