当前使用 SqlPackage.exe cmd 线工具生成脚本,方法是将 DacPac 文件与目标数据库进行比较。这将创建数据库(如果尚不存在(。
我们现在希望将其切换为使用 Microsoft.Data.Tools.Msbuild Nuget 包(使用 C# 进行部署(,但是当数据库容器不存在时,使用 SchemaCompare 进行比较将失败。似乎没有太多与该包相关的文档。
作为此软件包的一部分,是否有任何工具可以让我在比较之前创建一个空数据库容器?
我目前正在使用以下代码(在与现有数据库进行比较时有效(:
SchemaCompareDacpacEndpoint sourceDacpac = new SchemaCompareDacpacEndpoint(@"C:DeployDB.dacpac");
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
csb.DataSource = @".";
csb.InitialCatalog = "DeployTestDB";
csb.IntegratedSecurity = true;
SchemaCompareDatabaseEndpoint targetDatabase = new SchemaCompareDatabaseEndpoint(csb.ToString());
SchemaComparison comparison = new SchemaComparison(sourceDacpac, targetDatabase);
comparison.Options.DropObjectsNotInSource = true;
comparison.Options.BlockOnPossibleDataLoss = false;
comparison.Options.TreatVerificationErrorsAsWarnings = true;
comparison.Options.ScriptDatabaseOptions = true;
comparison.Options.GenerateSmartDefaults = true;
SchemaComparisonResult comparisonResult = comparison.Compare();
此时,比较结果有一条错误消息: {错误 SQL0: 无法打开登录名请求的数据库"DeployTestDB"。登录失败。用户"我的用户名"登录失败。
看看 Microsoft.SqlServer.Dac.dll 中的 DacServices 类。
代码如下所示:
using Microsoft.SqlServer.Dac;
class Program
{
static void Main(string[] args)
{
DacServices ds = new DacServices(@"Data Source=SERVERNAME;Initial Catalog=DATABASENAME;Integrated Security=true");
using (DacPackage dp = DacPackage.Load(@"C:tempmydb.dacpac"))
{
ds.Deploy(dp, @"DATABASENAME", upgradeExisting: false, options: null, cancellationToken: null);
}
}
}