2016-07-04 74 views
2

這次調用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

+0

以何種方式失敗? –

+0

對不起 - 我在寫完之前不小心提交了這個問題 - 添加一個新標籤導致了這個問題。 – crimbo

+1

很酷,「sqllocaldb info mssqllocaldb」和「sqllocaldb v」是做什麼的? –

回答

4

對此問題進行修復的確,以更新我們正在使用Microsoft.SqlServer.Dac集的版本 - 我發現,我應該嘗試看到@凱文 - 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. 「官方」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包
  • 請改善錯誤信息以表明需要更新的客戶端軟件
  • 請求其他NuG et軟件包維護人員注意官方NuGet軟件包的存在,或提供參考官方NuGet軟件包的升級,B/c存在多個軟件包可能會引起焦慮。

(順便說一句,儘管這裏的困難,DAC/SSDT是真棒。我還沒有看到任何競爭關係數據庫的任何類似的開發工具。)

+1

感謝Crimbo,我們將研究更新文檔。一個問題 - 非官方的Dac nuget是許多人使用的東西。會消除這不影響/打破他們?這是我們沒有努力完成這個任務的原因。我們試圖平衡獲得官方支持,避免對現有用戶產生負面影響。 –

+0

你是對的凱文,把它放下會太破壞性。我會刪除該建議。其他選項如請求作者部署一個空的新nuget包,具有正確的版本號(13.0),但是依賴於正確的nuget包?或者至少在NuGet頁面上留言。 – crimbo

+0

我們當然可以問這個 - 我們已經聯繫了他們,他們很樂意幫助我們獲得正式版本的支持 –