我正在使用Microsoft数据-分层应用程序框架创建一个基于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在上述模式下执行。
我想我的问题不像我在标题中所说的那么具体。我真正需要做的是通过DacPackage框架执行从.Net生成的脚本。有人能帮我吗?
发布于 2014-10-28 20:07:08
SQLCMD模式命令不是those命令;它们只在( SSMS ) / Visual (VS)和SQLCMD.EXE中工作。SQLCMD-模式本质上是SQLCMD.EXE的工作方式,可以在SSMS/VS中手动启用;它是这些应用程序的一部分,而不是通过提供程序可以完成的工作。
这些应用程序解释SQLCMD模式命令,而不将它们传递给Server。首先解析/执行SQLCMD模式命令(这是它们如何影响即将提交的SQL ),然后将SQL的最终版本提交给Server。
因此,SQL Server Data Tools (SSDT) / Visual Studio生成的部署SQL脚本需要通过这三个程序之一运行。
由于您已经有了一个.dacpac文件,所以微软提供了几种方法来发布您应该查看的文件:
SqlPackage.exe和MSDeploy.exe.它们都是在用于使用命令行工具面向项目的数据库开发的MSDN页面中描述的。DacServices.Deploy()。这可以通过C#通过DacServices类完成。您还可以通过DacServices.GenerateDeployScript()创建发布SQL脚本,但这不会改变上述情况,因为发布/部署SQL脚本(无论是从Visual“发布{project_name}”还是从GenerateDeployScript()生成的脚本)都是相同的脚本。这意味着它将具有SQLCMD模式冒号命令(如:setvar和:on error exit )以及SQLCMD模式变量,这些变量至少将是在以下行中使用的$(DatabaseName):
USE [$(DatabaseName)];虽然可以通过将:setvar的DacDeployOptions属性设置为true来注释初始的:on error exit行,但仍然会留下:on error exit行和用于检测是否启用了SQLCMD模式的:setvar __IsSqlCmdEnabled "True"行。就在这条特定的: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数据工具可以生成什么样的部署脚本的所有情况下都能工作。但这似乎是一种选择。
此外,更重要的是:您不需要SMO来运行SQL脚本。SMO是通过对象而不是直接通过T命令与Server交互的手段。
编辑:
其他人尝试过并发现它不起作用的链接:
使生成的发布SQL脚本可编程地工作的可能性:
SQLCMD.EXE -i filename.sql:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.start(v=vs.110).aspxhttps://stackoverflow.com/questions/26617247
复制相似问题