C#通过ODBC DSN连接SQL Server报无效属性及登录失败
问题排查方向与解决方案
报错1:仅指定DSN时返回Login failed for user ''
核心原因是程序没有读取到DSN中存储的认证信息,按以下顺序排查:
- 核对ODBC数据源位数与运行程序位数是否匹配
系统中存在两套完全隔离的ODBC配置存储:- 64位进程仅能读取
C:\Windows\System32\odbcad32.exe(即控制面板默认入口打开的ODBC管理器)中配置的DSN - 32位进程仅能读取
C:\Windows\SysWOW64\odbcad32.exe中配置的DSN
到WPF项目属性的生成页,确认当前编译的目标平台:如果是x86、或Any CPU勾选了「首选32位」,程序运行是32位,必须打开32位对应的ODBC管理器确认目标DSN存在,且在管理器内直接点击「测试连接」可以正常连通。
- 64位进程仅能读取
- 检查DSN的认证模式配置
配置SQL Server类型DSN时,如果向导中选择了「Windows NT集成认证」,DSN不会存储SQL账号密码信息,连接时会默认取当前Windows进程的账号做认证,和预期的SQL账号登录逻辑冲突。需要将认证模式改为「使用用户输入登录ID和密码的SQL Server验证」,填入账号密码后保存配置。 - 检查组策略限制
部分Windows系统默认组策略会禁止ODBC数据源存储明文密码,这种场景下即使你在DSN配置中填了密码,也不会被持久化保存,必须在连接字符串中显式传入账号密码参数。
报错2:显式传参时返回Invalid connection string attribute
这个报错是连接字符串参数名错误导致:SQL Server ODBC驱动识别的密码参数为PWD,不是代码中写的PW,缺少末尾的D字符,驱动无法识别该属性就会抛出参数无效错误。
修正后的连接字符串代码如下:
string connString = $"DSN={dsn};UID={username};PWD={password};"; OdbcConnection cnn = new OdbcConnection(connString); cnn.Open();
额外兼容注意事项
- 如果使用ODBC Driver 18及以上版本连接SQL Server,驱动默认强制加密连接,测试环境下如果SQL Server没有配置合法可信证书,需要在连接字符串中追加
TrustServerCertificate=Yes;,否则会抛出证书链不受信任的连接错误。 - 连接字符串的参数值不要额外包裹单引号、双引号,否则会被识别为参数值的一部分,导致账号密码匹配失败。
- 参数名不区分大小写,但UID/PWD和值之间的等号前后不要加全角空格,否则会被识别为无效格式。
内容的提问来源于stack exchange,提问作者Jason S
相关产品推荐
相关产品推荐

