SQL连接Open方法抛出异常:System.Security.SecurityException: 操作已成功完成
嘿,你遇到的这个异常确实有点反直觉——明明提示“操作已成功完成”,结果却抛出了SecurityException。结合你给出的环境(.NET 6 + System.Data.SqlClient v4.8.6)和代码片段,我给你几个实用的排查方向:
先确认连接字符串的端口格式是否正确
你当前的连接字符串里写的是Server={ServerName,Port##};,要注意SQL Server连接字符串中端口号的写法:服务器名和端口号之间用逗号分隔,不能有多余空格,比如正确的示例是Server=MyDatabaseServer,1433;。你可以把占位符替换成实际的服务器名和端口后再测试,比如:Server=localhost,1433;Database=MyTargetDb;Trusted_Connection=True;Application Name=MyApp考虑切换到Microsoft.Data.SqlClient
虽然你用的是System.Data.SqlClient v4.8.6,但在.NET 6这类现代.NET环境下,官方更推荐维护中的Microsoft.Data.SqlClient客户端库,System.Data.SqlClient在.NET Core/.NET 5+环境下偶尔会出现权限相关的兼容性问题。你可以通过NuGet安装最新版的Microsoft.Data.SqlClient,然后把代码里的引用从using System.Data.SqlClient;换成using Microsoft.Data.SqlClient;,其他代码逻辑保持不变,再尝试打开连接。检查程序运行账户的SQL访问权限
因为你用的是Trusted_Connection=True(Windows身份验证),必须确保程序运行时的账户拥有访问目标SQL Server的权限:- 如果是桌面程序,右键以管理员身份运行试试,同时确认当前登录的Windows用户在SQL Server中已经被授权,能访问指定的数据库
- 如果是服务或者IIS托管的应用,要检查服务账户/应用池身份是否有对应的SQL Server登录权限和数据库访问权限
排查SQL Server的安全配置
先确认目标SQL Server是否开启了Windows身份验证模式;如果是混合模式,检查你的Windows账户有没有被禁用登录权限。另外,虽然这个异常是权限类的,但也可以快速确认下SQL Server的防火墙端口是否开放(不过防火墙问题一般会抛连接超时,这里可以作为补充排查点)
备注:内容来源于stack exchange,提问作者FastAl

