IIS部署的Web API无法访问同一台Windows Server 2008 R2上的SQL Server 2008 R2
问题原因
你看到的提及LocalDB和SQL Server Express的报错,是老版本SQL Server客户端驱动的通用 fallback 提示,不是服务器真的需要安装SQL Server Express。当驱动无法正确解析你提供的连接字符串、或者无法访问指定数据源时,就会默认尝试连接LocalDB实例,失败后抛出该错误,核心原因有三个:
- 连接字符串参数格式不兼容:Windows Server 2008 R2自带的SQL Server客户端驱动版本较老,对参数格式要求严格,你当前连接字符串里的
PersistSecurityInfo没有加空格(正确写法为Persist Security Info),老版本驱动会识别为无效参数,直接忽略整个连接字符串,走默认的LocalDB连接逻辑。而Windows Server 2012 R2的驱动版本更新,兼容无空格的写法,所以该环境下运行正常。 - 连接字符串被上层配置覆盖:Windows Server 2008 R2的
machine.config默认内置了指向LocalDB的DefaultConnection连接字符串,如果你的代码没有明确指定自定义连接字符串名称,或者没有清除上层继承的配置,ORM框架(比如EF)会默认使用该内置的LocalDB连接字符串。 - 应用程序池位数与驱动不匹配:如果你的应用程序池开启了32位兼容,但服务器上只安装了64位的SQL Server Native Client,32位进程无法调用64位驱动,也会导致连接解析失败。
解决方案
按优先级依次尝试以下操作:
- 首先修正连接字符串的参数格式,补充参数间的空格,同时显式指定SQL Server默认端口1433避免实例解析失败,并且在节点最开头加
<clear/>清除所有上层继承的配置:
<connectionStrings> <clear /> <add name="你的连接字符串名称" connectionString="Data Source=ip-address,1433;Initial Catalog=database;Persist Security Info=True;User ID=sa;Password=你的密码;" providerName="System.Data.SqlClient" /> </connectionStrings>
- 检查应用程序池的位数配置:打开对应应用程序池的「高级设置」,查看「启用32位应用程序」选项,如果值为
True,请安装32位的SQL Server Native Client;如果值为False,请安装64位的SQL Server Native Client。 - 确认代码中初始化数据库连接时明确指定了自定义的连接字符串名称:比如Entity Framework的DbContext构造函数要传入你配置中的连接字符串名,不要使用无参构造函数(无参构造默认会查找名为
DefaultConnection的连接字符串)。 - 直接在出问题的Windows Server 2008 R2本机打开SSMS,使用连接字符串中的IP、sa账号密码尝试连接数据库,排除本机网络、端口监听问题。
内容的提问来源于stack exchange,提问作者Prokurors
相关产品推荐
相关产品推荐

