【问题标题】:DacServices.Deploy to SQL Server LocalDB 2016 failing - unable to connectDacServices.Deploy to SQL Server LocalDB 2016 失败 - 无法连接
【发布时间】: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


【解决方案1】:

解决这个问题的方法确实是更新我们正在使用的 Microsoft.SqlServer.Dac 程序集的版本 - 我发现我应该在看到 @kevin-cunnane 的建议之前不久尝试一下。

有几个因素使得这一点不太明显,这就是为什么它出现在 SO 上:

  1. Dac 的错误消息“无法连接到目标服务器”并不表示版本不兼容。然而,从互联网上浏览(例如DACPAC won't deploy because 'can't connect to server'?),除了连接字符串不正确、防火墙问题等外,此错误消息似乎还意味着版本不兼容。
  2. 发布了几个 NuGet 包,其中包含 Microsoft.SqlServer.Dac 和相关程序集。其中一些不是由 Microsoft 维护的,包括我使用的那个 (Microsoft.SqlServer.Dac)。微软官方版本直到 2016 年 6 月才在 NuGet.org 上可用,并且它没有最明显的 NuGet id (Microsoft.SqlServer.DacFx.x64)。所以运行update-package Microsoft.SqlServer.Dac 并没有达到预期的效果。
  3. MSDN + DAC 页面上的任何地方都没有列出“官方”NuGet 包 - 您可能认为这里会提到它:https://msdn.microsoft.com/en-us/library/dn702988%28v=sql.120%29.aspx - 但事实并非如此。
  4. Visual Studio 2016 安装 SQL LocalDB 2016,它确实包含正确的 Dac 程序集 (C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\130\Microsoft.SqlServer.Dac.dll),但它们未安装在 GAC 中或以其他方式容易找到。

有效的修复是

# Remove the old NuGet dependencies
uninstall-package Microsoft.SqlServer.Dac

# Install the new Dac NuGet package
Install-Package Microsoft.SqlServer.DacFx.x64

Dac 团队的请求,如果你碰巧看到这个:

  • 请从 MSDN 文档链接到正确的 NuGet 包
  • 请改进错误消息以表明需要更新的客户端软件
  • 请要求其他 NuGet 包维护者注意官方 NuGet 包的存在,或提供引用官方 NuGet 包的升级,因为多个包的存在可能会引起焦虑。

(顺便说一句,尽管有困难,Dac/SSDT 还是 AWESOME。我还没有看到任何可用于任何竞争关系数据库的类似开发工具。)

【讨论】:

  • 感谢 Crimbo,我们会考虑更新文档。一个问题 - 非官方的 Dac nuget 是许多人使用的东西。删除它不会影响/破坏它们吗?这是我们没有推动完成这项工作的原因。我们正在努力平衡获得官方支持与避免对现有用户的负面影响。
  • 你说得对,Kevin,把它拿下来太破坏性了。我将删除该建议。其他选项怎么样,比如要求作者部署一个空的新 nuget 包,具有​​正确的版本 # (13.0) 但依赖于正确的 nuget 包?或者至少在他们的 NuGet 页面上添加注释。
  • 我们当然可以问这个问题——我们已经联系了他们,他们很乐意帮助我们获得良好支持的正式版本
  • 我同意,SSDT 彻底改变了我们的开发流程
  • 感谢 Crimbo!我在使用 azure sql db 时也遇到了同样的问题,显然在我们的管理软件中更改 dacpac 版本解决了这个问题。首先,我向 azure 团队提出票证,我被重定向到 sql 团队,然后我被要求使用 ssms 进行部署,最后你的回答起到了神奇的作用。在解决这个问题上浪费了很多精力和时间。如果错误消息得到修复,那将非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多