如何将SMO(SQL Server管理对象)与OLEDB驱动MSOLEDBSQL/MSOLEDBSQL19配合使用?
解决SMO使用MSOLEDBSQL19替代SQLNCLI的问题
问题根源
你的脚本直接将OleDbConnection实例传入ServerConnection,这并非SMO推荐的用法,导致连接未正确初始化,进而$Master为null。SMO的ServerConnection对OLE DB连接的处理需要显式指定驱动,而非直接传递已创建的OleDbConnection对象。
正确实现步骤
确保依赖环境就绪
- 安装最新版的MSOLEDBSQL19驱动
- 使用最新版的SMO组件(建议通过NuGet安装
Microsoft.SqlServer.SqlManagementObjects,避免旧版本对旧驱动的依赖)
调整PowerShell脚本
不要直接创建OleDbConnection,而是通过ServerConnection的连接字符串和Provider属性来指定使用MSOLEDBSQL19:# 构建连接字符串,指定MSOLEDBSQL19驱动 $connectionString = "Data Source=myServer;Initial Catalog=myDB;Provider=MSOLEDBSQL19;Persist Security Info=False;Auto Translate=False;Encrypt=true;TrustServerCertificate=false;Connection Timeout=600;Integrated Security=SSPI;" # 创建ServerConnection并设置Provider和连接字符串 $serverConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection $serverConnection.ConnectionString = $connectionString $serverConnection.ProviderName = "MSOLEDBSQL19" # 初始化SMO Server对象 $sqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server $serverConnection # 验证连接(可选,确保连接成功) $sqlServer.ConnectionContext.Connect() # 获取master数据库 $master = $sqlServer.Databases["master"] # 输出验证 if ($master) { Write-Host "成功获取master数据库,名称:$($master.Name)" } else { Write-Host "获取master数据库失败,请检查连接配置" }
额外说明
- SMO并未被弃用,微软仍在维护更新最新版本,新版本的SMO已支持MSOLEDBSQL系列驱动
- 若仍遇到问题,检查以下几点:
- 确认MSOLEDBSQL19驱动已正确安装,可通过ODBC数据源管理器查看
- 确保PowerShell运行环境加载了正确版本的SMO程序集(避免版本冲突)
- 验证连接字符串中的参数是否正确(如服务器名称、加密设置等)
内容的提问来源于stack exchange,提问作者QFirstLast
相关产品推荐
相关产品推荐

