DacServices.Deploy到SQL Server的LocalDB 2016失败 - 无法连接
这次调用DacServices.Deploy
一直致力于伟大的SQL Server的LocalDB 2014年,但没有安装SQL Server的LocalDB 2016时:DacServices.Deploy到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)
的“无法连接”的错误似乎不正确/可能掩盖真正的错误,一方面是因为指定的连接字符串允许我连接到使用数据库0,因为我可以使用命令行部署此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
对此问题进行修复的确,以更新我们正在使用Microsoft.SqlServer.Dac
集的版本 - 我发现,我应该尝试看到@凯文 - cunnane的之前不久建议。
有报道说,作出这一比明显少了几个因素,这就是为什么它是在SO:
- DAC的错误消息“无法连接到目标服务器”并不表示任何一个版本不兼容。但是,从互联网上拨动(例如DACPAC won't deploy because 'can't connect to server'?)似乎这个错误信息可能意味着版本不兼容,除了不正确的连接字符串,防火墙问题等。
- 有几个NuGet包发布,其中包含
Microsoft.SqlServer.Dac
和相关的程序集。其中一些不是由Microsoft维护的,包括我正在使用的那个(Microsoft.SqlServer.Dac)。直到2016年6月,官方微软版本才在NuGet.org上发布,并且没有最明显的NuGet ID(Microsoft.SqlServer.DacFx.x64)。所以运行update-package Microsoft.SqlServer.Dac
没有达到预期的效果。 - “官方”NuGet包未在MSDN + DAC页面上的任何位置列出 - 您会认为这里将提及:https://msdn.microsoft.com/en-us/library/dn702988%28v=sql.120%29.aspx - 但事实并非如此。
- 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包
- 请改善错误信息以表明需要更新的客户端软件
- 请求其他NuG et软件包维护人员注意官方NuGet软件包的存在,或提供参考官方NuGet软件包的升级,B/c存在多个软件包可能会引起焦虑。
(顺便说一句,尽管这里的困难,DAC/SSDT是真棒。我还没有看到任何竞争关系数据库的任何类似的开发工具。)
感谢Crimbo,我们将研究更新文档。一个问题 - 非官方的Dac nuget是许多人使用的东西。会消除这不影响/打破他们?这是我们没有努力完成这个任务的原因。我们试图平衡获得官方支持,避免对现有用户产生负面影响。 –
你是对的凯文,把它放下会太破坏性。我会删除该建议。其他选项如请求作者部署一个空的新nuget包,具有正确的版本号(13.0),但是依赖于正确的nuget包?或者至少在NuGet页面上留言。 – crimbo
我们当然可以问这个 - 我们已经联系了他们,他们很乐意帮助我们获得正式版本的支持 –
以何种方式失败? –
对不起 - 我在写完之前不小心提交了这个问题 - 添加一个新标签导致了这个问题。 – crimbo
很酷,“sqllocaldb info mssqllocaldb”和“sqllocaldb v”是做什么的? –