【发布时间】:2016-07-04 12:42:55
【问题描述】:
此对DacServices.Deploy 的调用在 SQL Server LocalDB 2014 中运行良好,但在安装 SQL Server LocalDB 2016 时失败:
string dacConnectionString = $"Server=(localdb)\\mssqllocaldb; Integrated Security=true; database={DatabaseName}";
var dacServices = new DacServices(dacConnectionString);
dacServices.Message += (sender, args) => Console.WriteLine($"{args.Message.Prefix}: {args.Message.Message}"); // Log dacpac deploy messages
dacServices.Deploy(LoadDacPac(), DatabaseName, true, new DacDeployOptions()
{
BlockOnPossibleDataLoss = false
});
DacServices.Deploy 为 LocalDB 2016 引发的异常是:
Microsoft.SqlServer.Dac.DacServicesException was unhandled by user code
HResult=-2146233088
Message=Could not deploy package.
Source=Microsoft.SqlServer.Dac
StackTrace:
at Microsoft.SqlServer.Dac.DeployOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
at Microsoft.SqlServer.Dac.OperationExtension.Execute(IOperation operation, DacLoggingContext loggingContext, CancellationToken cancellationToken)
at Microsoft.SqlServer.Dac.DacServices.InternalDeploy(IPackageSource packageSource, Boolean isDacpac, String targetDatabaseName, DacDeployOptions options, CancellationToken cancellationToken, DacLoggingContext loggingContext)
at Microsoft.SqlServer.Dac.DacServices.Deploy(DacPackage package, String targetDatabaseName, Boolean upgradeExisting, DacDeployOptions options, Nullable`1 cancellationToken)
at Tv.Base.Test.Database.TestSqlLocalDb.CreateOrUpdateDatabaseIfNeeded(Boolean force) in D:\BuildAgent-02\work\6ec37398501798d0\src\Base.Test.Database\TestSqlLocalDb.cs:line 173
at Tv.Services.Inventory.DataAccess.Tests.InventoryDatabaseFixture..ctor() in C:\src\tv\services\inventory\test\DataAccess.Tests\InventoryDatabaseFixture.cs:line 40
InnerException:
HResult=-2146233088
Message=Unable to connect to target server.
Source=Microsoft.Data.Tools.Schema.Sql
StackTrace:
at Microsoft.Data.Tools.Schema.Sql.Deployment.SqlDeploymentEndpointServer.OnInit(ErrorManager errors, String targetDBName)
at Microsoft.Data.Tools.Schema.Sql.Deployment.SqlDeployment..ctor(SqlDeploymentConstructor constructor)
at Microsoft.Data.Tools.Schema.Sql.Deployment.SqlDeploymentConstructor.ConstructServiceImplementation()
at Microsoft.SqlServer.Dac.DacServices.CreatePackageToDatabaseDeployment(String connectionString, IPackageSource packageSource, String targetDatabaseName, DacDeployOptions options, ErrorManager errorManager)
at Microsoft.SqlServer.Dac.DeployOperation.<>c__DisplayClass3.<>c__DisplayClass5.<CreatePlanInitializationOperation>b__1()
at Microsoft.Data.Tools.Schema.Sql.Dac.OperationLogger.Capture(Action action)
at Microsoft.SqlServer.Dac.DeployOperation.<>c__DisplayClass3.<CreatePlanInitializationOperation>b__0(Object operation, CancellationToken token)
at Microsoft.SqlServer.Dac.Operation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
at Microsoft.SqlServer.Dac.ReportMessageOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
at Microsoft.SqlServer.Dac.OperationExtension.CompositeOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
at Microsoft.SqlServer.Dac.OperationExtension.CompositeOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
at Microsoft.SqlServer.Dac.DeployOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
“无法连接”错误似乎不正确/可能掩盖了真正的错误,既因为指定的连接字符串允许我使用SqlConnection 连接到数据库,又因为我可以将此 dacpac 部署到 SQL Server LocalDB 2016使用命令行:
sqlpackage "/Action:publish" "/SourceFile:MyDatabase.dacpac" "/TargetConnectionString:Server=(localdb)\mssqllocaldb;Database=MyDatabase;Integrated Security=true"
关于我的设置的更多信息:
> sqllocaldb info mssqllocaldb
Name: MSSQLLocalDB
Version: 13.0.1601.5
Shared name:
Owner: DOMAIN\user
Auto-create: Yes
State: Running
Last start time: 7/1/2016 5:09:43 PM
Instance pipe name: np:\\.\pipe\LOCALDB#C1DD8548\tsql\query
> sqllocaldb v
Microsoft SQL Server 2014 (12.0.2000.8)
Microsoft SQL Server 2016 (13.0.1601.5)
正在使用的 Microsoft.SqlServer.Dac 程序集来自此 NuGet 包:
https://www.nuget.org/packages/Microsoft.SqlServer.Dac
【问题讨论】:
-
以什么方式失败?
-
抱歉 - 我在写完之前不小心提交了问题 - 添加新标签导致了这个问题。
-
酷,“sqllocaldb info mssqllocaldb”和“sqllocaldb v”有什么作用?
-
连接字符串中的“{DatabaseName}”只是为了堆栈溢出?如果打印连接字符串是否正确?
-
您使用的是什么版本的 DLL?您将需要 v13 DLL(现在以 nuget 的形式提供:nuget.org/packages/Microsoft.SqlServer.DacFx.x64)来定位 SQL Server 2016 服务器。您可能仍在绑定到 v12 DLL。
标签: sql-server-data-tools localdb dac sql-server-2016-localdb