[英]ServerConnection.ExecuteNonQuery in SQLCMD Mode
我正在使用Microsoft Data-Tier Application框架來創建基於DacPackage對象的部署腳本。 我試圖使用Microsoft.SqlServer.Management.Smo.Server類來執行此腳本...
SqlConnection deployConnection = new SqlConnection(connBuilder.ToString());
deployConnection.Open();
Server server = new Server(new ServerConnection(deployConnection));
server.ConnectionContext.ExecuteNonQuery(deployScript);
然而,這錯誤...
Unhandled Exception: Microsoft.SqlServer.Management.Common.ExecutionFailureException:
An exception occurred while executing a Transact-SQL statement or batch. --->
System.Data.SqlClient.SqlException: Incorrect syntax near ':'.
我知道這個問題的答案是我需要處於SQLCMD模式,但我不知道如何告訴我的ServerConnection在所述模式下執行。
我想我的問題不像我在標題中說的那樣具體。 我真正需要做的是通過.Net框架執行從DacPackage生成的腳本。 誰能幫我這個?
SQLCMD模式命令不是 T-SQL命令; 它們僅適用於SQL Server Management Studio(SSMS)/ Visual Studio(VS)和SQLCMD.EXE。 SQLCMD模式本質上是SQLCMD.EXE的工作方式,可以在SSMS / VS中手動啟用; 它是這些應用程序的一部分,而不是可以通過提供程序完成的任務。
這些應用程序解釋SQLCMD模式命令,並且不將它們傳遞給SQL Server。 首先解析/執行SQLCMD模式命令(這是它們能夠影響即將提交的SQL的方式),然后將SQL的最終版本提交給SQL Server。
因此,SQL Server數據工具(SSDT)/ Visual Studio生成的部署SQL腳本需要通過這三個程序之一運行。
由於您已經有.dacpac
文件,Microsoft提供了幾種方法來發布您應該檢出的文件:
SqlPackage.exe
和MSDeploy.exe
。 它們都在使用命令行工具的面向項目的數據庫開發的MSDN頁面上進行了描述。 DacServices.Deploy()
。 這可以通過DacServices類在C#中完成。 您還可以通過DacServices.GenerateDeployScript()創建發布SQL腳本,但這不會改變上述情況,因為發布/部署SQL腳本,無論是從Visual Studio“Publish {project_name}”還是GenerateDeployScript()
,是相同的腳本。 意思是,它將具有SQLCMD模式冒號命令,例如:setvar
和:on error exit
以及SQLCMD模式變量,它們至少是$(DatabaseName)
,用於以下行:
USE [$(DatabaseName)];
雖然可以注釋掉初始:setvar
通過設置線DacDeployOptions財產CommentOutSetVarDeclarations到true
,仍然會留下:on error exit
產品,以及為一個行:setvar __IsSqlCmdEnabled "True"
,用來檢測是否是否已啟用SQLCMD模式。 就在這個特定的上方:setvar
行是一條評論說明:
/*
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported.
To re-enable the script after enabling SQLCMD mode, execute the following:
SET NOEXEC OFF;
*/
所以他們確實打算只通過SQLCMD運行這個腳本,無論是通過DOS - > SQLCMD.EXE還是PowerShell - > Invoke-SqlCMD。
從技術上講,可以生成一個部署腳本內容的字符串(而不是stream
),並通過a)刪除任何冒號命令來操縱該字符串,以及b)將“$(DatabaseName)”替換為您想要的任何數據庫部署到。 但是,我沒有嘗試過這個,我不推薦這個,我不確定它是否適用於SQL Server Data Tools可以生成哪些部署腳本的所有情況。 但它似乎是一種選擇。
此外,有點相關:您不需要SMO來運行SQL腳本。 SMO是通過對象而不是直接通過T-SQL命令與SQL Server交互的手段。
編輯:
其他人嘗試過的鏈接,發現它不起作用:
使生成的發布SQL腳本以programmaticaly方式工作的可能性:
SQLCMD.EXE -i filename.sql
: http : //msdn.microsoft.com/en-us/library/system.diagnostics.process.start( SQLCMD.EXE -i filename.sql
.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.