Ошибка DacServices.Deploy to SQL Server LocalDB 2016 - невозможно подключиться

Этот призыв к 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

1 ответ

Решение

Исправление для этого было действительно обновить версию Microsoft.SqlServer.Dac сборки, которые мы использовали - я обнаружил, что должен попробовать это незадолго до того, как увижу предложение @kevin-cunnane.

Было несколько факторов, которые сделали это менее очевидным, вот почему это на SO:

  1. Сообщение об ошибке Dac "Невозможно подключиться к целевому серверу" никоим образом не указывает на несовместимость версий. Однако из-за того, что вы ковыряетесь в Интернете (например, DACPAC не развертывается, потому что "не может подключиться к серверу"?), Кажется, что это сообщение об ошибке может означать несовместимость версий в дополнение к неверной строке подключения, проблеме с брандмауэром и т. Д.
  2. Опубликовано несколько пакетов NuGet, которые содержатMicrosoft.SqlServer.Dacи связанные с ними сборки. Microsoft не поддерживает некоторые из них, включая тот, который я использовал ( https://www.nuget.org/packages/Microsoft.SqlServer.Dac). Официальный выпуск Microsoft не был доступен на NuGet.org до июня 2016 года и не имеет наиболее очевидного идентификатора NuGet ( https://www.nuget.org/packages/Microsoft.SqlServer.DacFx.x64/). Так работаетupdate-package Microsoft.SqlServer.Dacне дал желаемого эффекта.
  3. "Официальный" пакет NuGet нигде не указан на страницах MSDN + DAC - можно подумать, что он будет упомянут здесь: 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, если вы видите это:

  • Пожалуйста, ссылку на правильный пакет NuGet из документации MSDN
  • Пожалуйста, улучшите сообщение об ошибке, чтобы указать, что требуется более новое клиентское программное обеспечение.
  • Пожалуйста, попросите других сопровождающих пакета NuGet отметить наличие официального пакета NuGet или предоставить обновление, которое ссылается на официальный пакет NuGet, так как наличие нескольких пакетов может вызвать беспокойство.

(Между прочим, несмотря на трудности здесь, Dac/SSDT является УДИВИТЕЛЬНЫМ. Я не видел никакого сопоставимого инструмента разработки для любых конкурентоспособных реляционных баз данных.)

Другие вопросы по тегам