5

この呼び出し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.DeployLocalDB 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

4

1 に答える 1

8

これに対する修正は、実際に使用していたアセンブリのバージョンを更新するMicrosoft.SqlServer.Dacことでした.@ kevin-cunnane の提案を見る直前に、それを試してみるべきであることがわかりました.

これが明らかではないいくつかの要因があり、それが SO にある理由です。

  1. Dac のエラー メッセージ「ターゲット サーバーに接続できません」は、バージョンの非互換性を示すものではありません。ただし、インターネットを調べてみると (たとえば、「サーバーに接続できないため DACPAC は展開されませんか?」 )、このエラー メッセージは、接続文字列の誤り、ファイアウォールの問題などに加えて、バージョンの非互換性を意味するようです。
  2. Microsoft.SqlServer.Dacおよび関連するアセンブリを含むいくつかの NuGet パッケージが投稿されています。それらのいくつかは、私が使用していたもの ( Microsoft.SqlServer.Dac ) を含め、Microsoft によって管理されていません。Microsoft の公式リリースは、2016 年 6 月まで NuGet.org で入手できませんでした。また、最も明白な NuGet id ( 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 チームへのリクエスト:

  • MSDN ドキュメントから正しい NuGet パッケージにリンクしてください
  • 新しいクライアント ソフトウェアが必要であることを示すようにエラー メッセージを改善してください
  • 他の NuGet パッケージ メンテナーに、公式の NuGet パッケージの存在に注意するか、公式の NuGet パッケージを参照するアップグレードを提供するように依頼してください。b/c 複数のパッケージが存在すると不安が生じる可能性があります。

(ちなみに、ここでの困難にもかかわらず、Dac/SSDT は素晴らしいです競合するリレーショナル データベースに匹敵する開発ツールは見たことがありません。)

于 2016-07-05T20:07:11.297 に答える