Mac M1升级.NET6替换SqlClient后出现Value cannot be null错误求助
问题原因及解决方案
问题原因
你的问题出在Microsoft.Data.SqlClient在Mac M1 ARM架构下的SQL Server实例解析逻辑缺陷:
- 连接字符串使用了
IP地址\命名实例的格式(172.18.176.74\SANA),此时驱动会通过SQL Server Resolution Protocol(SSRP,即SQL Server浏览器服务)查询该命名实例对应的端口号。 - 在Mac M1的ARM环境中,Microsoft.Data.SqlClient的SSRP实现存在bug:当尝试获取目标主机的IP列表时返回了
null,后续调用Linq的Where方法时,传入的source参数为空,直接触发了「Value cannot be null. (Parameter 'source')」异常。 - 旧版本的
System.Data.SqlClient跨平台处理SSRP的逻辑与新版不同,未出现该问题;而Windows平台的Microsoft.Data.SqlClient不存在此ARM架构下的实现缺陷,因此运行正常。
解决方案
可以通过以下方式解决问题:
- 直接指定端口号:先查询SQL Server命名实例
SANA对应的端口(可通过SQL Server配置管理器、netstat命令或数据库服务器端查询),修改连接字符串为Data Source=172.18.176.74,端口号;Initial Catalog=SANA;User Id=Sana;password=******;MultipleActiveResultSets=true;Persist Security Info=True;,绕过SSRP解析流程。 - 升级Microsoft.Data.SqlClient版本:将NuGet包升级到最新稳定版,该ARM架构下的SSRP空引用bug大概率已被官方修复。
- 改用默认实例:若可调整SQL Server配置,将
SANA改为默认实例,连接字符串去掉\SANA,直接使用Data Source=172.18.176.74;...,默认使用1433端口,无需SSRP解析。
内容的提问来源于stack exchange,提问作者Hamid Mohammadi
相关产品推荐
相关产品推荐

