You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.dll
    • Microsoft.SqlServer.ConnectionInfo.dll
    • Microsoft.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:15:31