SqlPackage执行报错‘对象引用未设置’的解决方案咨询
问题与解决方案
问题详情
执行SqlPackage生成Azure SQL Database发布脚本时触发空引用异常,命令及错误信息如下:
执行命令
C:\source>sqlpackage /Action:Script /SourceFile:".\src\Databases\Demo.Build\publish\Demo.Build.dacpac" /OutputPath:".\test.sql" /TargetServerName:demo.database.windows.net /TargetDatabaseName:DemoDB /TargetUser:demo /TargetPassword:demo /p:IncludeCompositeObjects=true /p:DoNotAlterChangeDataCaptureObjects=False /p:IgnoreIndexOptions=True /p:IgnoreWithNocheckOnForeignKeys=True /p:IgnorePermissions=True /p:IgnoreRoleMembership=True /p:BlockOnPossibleDataLoss=False /p:BlockWhenDriftDetected=False /p:GenerateSmartDefaults=True /p:DropIndexesNotInSource=False /p:DropObjectsNotInSource=False /p:ScriptDatabaseOptions=False /p:DropStatisticsNotInSource=False /p:DoNotAlterReplicatedObjects=False /p:IgnoreNotForReplication=True /p:AllowIncompatiblePlatform=True
错误输出
Generating publish script for database 'DemoDB' on server 'demo.database.windows.net'. *** A project which specifies SQL Server 2019 as the target platform may experience compatibility issues with Microsoft Azure SQL Database v12. Time elapsed 0:00:27.16 *** An unexpected failure occurred: Object reference not set to an instance of an object.
环境信息
- SqlPackage Version: 161.8089.0
- .NET Core: 7.0.203
此前构建dacpac时曾出现SQL71502警告(未解析[dbo].[sp_executesql]引用),已通过在.csproj中添加<PackageReference Include="Microsoft.SqlServer.Dacpacs" Version="150.0.0" DacpacName="master" />修复构建警告,但SqlPackage执行仍报错。
修复/规避方案
1. 对齐项目与目标数据库的平台版本
项目当前目标平台为SQL Server 2019,与Azure SQL Database v12存在兼容性提示,这可能是触发空引用的核心诱因:
- 在项目的
.csproj文件中修改目标平台配置:<TargetPlatformVersion>Azure SQL Database</TargetPlatformVersion> - 重新构建生成dacpac文件后,再次执行SqlPackage脚本生成命令。
2. 升级SqlPackage到最新稳定版
当前使用的SqlPackage 161.8089.0存在已知的空引用异常bug,升级到最新版本可解决此类问题:
- 执行以下命令升级全局安装的SqlPackage:
dotnet tool update -g microsoft.sqlpackage
3. 排查并调整冲突参数
部分参数组合可能触发内部逻辑错误,尝试逐步简化命令:
- 暂时移除
/p:AllowIncompatiblePlatform=True参数,先确保平台兼容性; - 若项目无复合对象依赖,去掉
/p:IncludeCompositeObjects=true,降低脚本生成的复杂度。
4. 验证dacpac完整性
虽然构建警告已修复,但dacpac可能存在隐性问题,先执行兼容性验证:
- 使用
Validate动作检查dacpac与目标数据库的兼容性:sqlpackage /Action:Validate /SourceFile:".\src\Databases\Demo.Build\publish\Demo.Build.dacpac" /TargetServerName:demo.database.windows.net /TargetDatabaseName:DemoDB /TargetUser:demo /TargetPassword:demo - 根据验证结果修复具体问题后,再生成发布脚本。
5. 替换适配Azure的数据库引用包
当前使用的Microsoft.SqlServer.Dacpacs 150.0.0版本是针对SQL Server的,替换为Azure SQL Database适配版本:
- 修改
.csproj中的包引用:<PackageReference Include="Microsoft.SqlServer.Dacpacs" Version="160.0.0" DacpacName="AzureSQLDB" /> - 重新构建dacpac后执行脚本生成命令。
内容的提问来源于stack exchange,提问作者Sol Lee
相关产品推荐
相关产品推荐

