Ошибка 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:
- Сообщение об ошибке Dac "Невозможно подключиться к целевому серверу" никоим образом не указывает на несовместимость версий. Однако из-за того, что вы ковыряетесь в Интернете (например, DACPAC не развертывается, потому что "не может подключиться к серверу"?), Кажется, что это сообщение об ошибке может означать несовместимость версий в дополнение к неверной строке подключения, проблеме с брандмауэром и т. Д.
- Опубликовано несколько пакетов 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
не дал желаемого эффекта. - "Официальный" пакет 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, если вы видите это:
- Пожалуйста, ссылку на правильный пакет NuGet из документации MSDN
- Пожалуйста, улучшите сообщение об ошибке, чтобы указать, что требуется более новое клиентское программное обеспечение.
- Пожалуйста, попросите других сопровождающих пакета NuGet отметить наличие официального пакета NuGet или предоставить обновление, которое ссылается на официальный пакет NuGet, так как наличие нескольких пакетов может вызвать беспокойство.
(Между прочим, несмотря на трудности здесь, Dac/SSDT является УДИВИТЕЛЬНЫМ. Я не видел никакого сопоставимого инструмента разработки для любых конкурентоспособных реляционных баз данных.)