Ubuntu Docker容器中SMO Script执行失败问题求助
在Ubuntu Docker容器中执行PowerShell SMO Script方法时遇到资源文件缺失错误的解决办法
错误根源
报错核心是System.Resources.MissingManifestResourceException,说明SMO组件在Ubuntu Docker环境下缺少必要的本地化资源文件,导致Microsoft.SqlServer.Management.Smo.TypeConverters类型初始化失败,最终触发数据库脚本生成失败。
解决步骤
安装跨平台兼容的SMO模块
确保使用支持Linux环境的SqlServer模块版本,避免依赖Windows特定资源:Install-Module -Name SqlServer -AllowClobber -Force -Scope CurrentUser注意:容器内需使用PowerShell 7.x及以上版本,以兼容该模块。
强制设置文化信息
在脚本开头添加文化设置,强制使用英文(en-US)文化,避免因系统文化不匹配导致资源查找失败:# 强制设置当前线程文化为en-US [System.Threading.Thread]::CurrentThread.CurrentCulture = 'en-US' [System.Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US'补充缺失的资源文件(若上述步骤无效)
- 从NuGet包
Microsoft.SqlServer.SqlManagementObjects中提取对应版本的资源文件,解压后获取en-US等资源文件夹; - 将资源文件夹复制到Docker容器内SMO程序集的安装目录,通常路径为
~/.local/share/powershell/Modules/SqlServer/<版本号>/lib/net6.0。
- 从NuGet包
验证.NET运行时环境
跨平台SMO依赖.NET 6.0及以上版本,确保容器内已安装:apt-get update && apt-get install -y dotnet-runtime-6.0
修改后脚本示例
# 强制设置文化信息以避免资源查找失败 [System.Threading.Thread]::CurrentThread.CurrentCulture = 'en-US' [System.Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US' foreach($x in $tb){ Write-Host $x.Name $dbase = $x.Name ## GENERATE DB AND OBJECT SCRIPT FROM SOURCE SERVER. $nameConve = "$($destinationSVR)_$($dbase)" Write-Host $nameConve $SQLSrvObj = new-object "Microsoft.SqlServer.Management.Smo.Server" $sourceConn $SQLSrvObj.Information ` | Select-Object parent, platform, product, productlevel, ` OSVersion, Edition, version, HostPlatform, HostDistribution ` | Format-List; $dbs = $SQLSrvObj.databases Write-Host $dbs $res = $dbs[$dbase].Script() Write-Host $res }
内容的提问来源于stack exchange,提问作者Ten Uy
相关产品推荐
相关产品推荐

