VB应用迁移至SQL Server2016后SMO加载报错,求代码修改方案
解决VB应用迁移SQL Server 2016后的SMO版本兼容问题
嘿,咱们一步步拆解这个问题~你看到的无法加载文件或程序集"MicrosoftSQLserver.SMO, Version=9.0.242.0..."报错,核心原因是你的VB应用还在找SQL Server 2005版本的SMO组件(9.0.242.0是2005对应的版本号),但你已经安装了SQL Server 2016的新版SMO,版本号完全不匹配,所以系统找不到旧组件就报错了。下面是具体的修复步骤:
一、更新项目中的SMO引用
这是最关键的第一步,得把项目里的旧引用彻底换成新的:
- 打开你的VB项目,在“解决方案资源管理器”里找到“引用”节点,右键展开
- 找到所有带
Microsoft.SqlServer.SMO、Microsoft.SqlServer.ConnectionInfo、Microsoft.SqlServer.Management.Sdk.Sfc字样的旧版本引用(版本号是9.0.x的),右键移除它们 - 右键“引用”→“添加引用”,切换到“浏览”选项卡,找到你安装的2016版SMO组件路径(通常在
C:\Program Files\Microsoft SQL Server\130\SDK\Assemblies,130是SQL Server 2016的版本代号) - 选中以下核心dll添加到引用:
Microsoft.SqlServer.SMO.dllMicrosoft.SqlServer.ConnectionInfo.dllMicrosoft.SqlServer.Management.Sdk.Sfc.dll- 如果用到了分析服务相关功能,再添加
Microsoft.AnalysisServices.dll
二、修复版本绑定(如果需要)
检查项目的配置文件(app.config,桌面应用):
- 打开配置文件,看看有没有
<runtime>节点下的<assemblyBinding>配置,如果有旧版本的SMO绑定,改成2016的版本号;如果没有,就添加这段配置:
注意:<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.SqlServer.SMO" publicKeyToken="89845dcd8080cc91" culture="neutral"/> <bindingRedirect oldVersion="9.0.242.0" newVersion="13.0.0.0"/> </dependentAssembly> <!-- 对其他SMO相关组件也做同样的绑定重定向,比如ConnectionInfo --> <dependentAssembly> <assemblyIdentity name="Microsoft.SqlServer.ConnectionInfo" publicKeyToken="89845dcd8080cc91" culture="neutral"/> <bindingRedirect oldVersion="9.0.242.0" newVersion="13.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime>newVersion要和你安装的SMO实际版本号一致,2016的SMO版本一般是13.0.0.0或者更高的13.x版本。
三、代码里的调整(仅针对特殊情况)
大部分情况下,只要更新引用和绑定,代码不需要大改——因为SMO的核心命名空间和API在2005到2016之间是向后兼容的。但如果你代码里硬编码了版本号或者直接实例化了旧版本的类型,比如:
' 旧代码(错误) Dim smoAssembly As Assembly = Assembly.Load("Microsoft.SqlServer.SMO, Version=9.0.242.0,...")
那就要把版本号去掉,改成加载无版本限制的组件,或者直接使用新版的类型:
' 新代码(正确) Dim sqlServer As New Microsoft.SqlServer.Management.Smo.Server("你的SQL2016服务器地址")
给你一个简单的新版SMO调用示例,你可以参考:
Imports Microsoft.SqlServer.Management.Smo Imports Microsoft.SqlServer.Management.Common Public Class Sql2016Helper Public Sub TestConnection() ' 创建连接信息,支持Windows认证或SQL认证 Dim connInfo As New ServerConnection("SQL2016服务器名") ' 如果用SQL认证,取消下面两行注释并填写账号密码 ' connInfo.Login = "sa" ' connInfo.Password = "你的密码" ' 初始化SMO Server对象 Dim sqlServer As New Server(connInfo) ' 测试连接并获取服务器信息 Try sqlServer.ConnectionContext.Connect() MessageBox.Show($"连接成功!服务器版本:{sqlServer.Information.Version}") Catch ex As Exception MessageBox.Show($"连接失败:{ex.Message}") Finally sqlServer.ConnectionContext.Disconnect() End Try End Sub End Class
四、编译和部署注意事项
- 编译项目时,确保你的VB项目的目标.NET框架版本和SMO组件兼容(SQL Server 2016的SMO一般支持.NET Framework 4.0及以上)
- 部署到工作站时,要确保已经安装了你提到的三个组件:SQL SysClrTypes、SharedManagementObjects(SMO)、SQL AS AMO,这样应用才能正确加载依赖库
内容的提问来源于stack exchange,提问作者Khin
相关产品推荐
相关产品推荐

