Wix - 二进制文件中的SQL方括号

时间:2016-03-14 19:46:05

标签: sql-server wix

更新:

虽然下面的答案可以作为替代解决方案,但我想提一下我的初始方法确实有效。在查看下面的答案后,我发现我的Session.Log()调用实际上是在发布到日志文件时剥离[...]。方括号保留在我的SQL中,因为我将它输入SQLCommand对象。我的实际问题是SQL(我只发布了前几行)中有'GO',它不是SQL命令。一旦我解决了这个问题一切正常:)

*(提醒一下,发布尽可能多的信息总是有帮助的:D)

在Wix中,我有以二进制元素存储的SQL文件

<Binary Id="SQLStep1" SourceFile="SourceDir\Step1_SQL_Build.sql"></Binary>
<Binary Id="SQLStep2a" SourceFile="SourceDir\Step2a_SQL_Build.sql"></Binary>
<Binary Id="SQLStep2b" SourceFile="SourceDir\Step2b_SQL_Build_sp_iv6Login.sql"></Binary>
<Binary Id="SQLStep2c" SourceFile="SourceDir\Step2c_SQL_Grant.sql"></Binary>

然后我使用自定义操作将sql拉出二进制表,并用字符串替换数据库名称(由安装程序中的文本框提供)

private static string ReplaceDBName(Session session, string binaryKeyName)
    {
        View v = session.Database.OpenView("SELECT Data FROM Binary WHERE Name = '{0}'", binaryKeyName);
        v.Execute();
        Record r = v.Fetch();

        using (StreamReader reader = new StreamReader(r.GetStream("Data")))
        {
            string text = reader.ReadToEnd();
            text = text.Replace(@"DB_NAME", session["DATABASE_NAME"]);
            session.Log("Running SQL: " + text);
            return text;
        }
    }

示例SQL语句是这样的:

USE [master]
GO
/****** Object:  Database [DB_NAME]    Script Date: 02/23/2010 15:02:47 ******/
CREATE DATABASE [DB_NAME] COLLATE SQL_Latin1_General_CP1_CI_AS
GO

然而,我从“二进制”表中获取的字符串似乎将所有内容都拉出来,就像它们是WiX属性一样,所以我留下了

USE 
GO
/****** Object:  Database     Script Date: 02/23/2010 15:02:47 ******/
CREATE DATABASE  COLLATE SQL_Latin1_General_CP1_CI_AS
GO

我可以设置一个标志,让WiX不认为SQL语法是WiX属性吗?

2 个答案:

答案 0 :(得分:5)

二进制文件中的方括号必须进行转义。所以

USE \[master\]
GO
/****** Object:  Database \[DB_NAME\]    Script Date: 02/23/2010 15:02:47 ******/
CREATE DATABASE \[DB_NAME\] COLLATE SQL_Latin1_General_CP1_CI_AS
GO

请注意,您可以通过设置名为DB_NAME的属性来利用此优势,然后将WiX更改为您的实际数据库名称。

您的另一个选择可能是将整个事物视为CDATA,例如

<![CDATA[USE [master]
GO
/****** Object:  Database [DB_NAME]    Script Date: 02/23/2010 15:02:47 ******/
CREATE DATABASE [DB_NAME] COLLATE SQL_Latin1_General_CP1_CI_AS
GO]]>

但我不确定这是否有用......

当然,您也可以只是不使用二进制表,而是以其他方式打包文件。将它们作为资源直接嵌入到自定义动作DLL中,然后从那里将它们拉出来,就像在Can I embed other files in a DLL?中一样。

答案 1 :(得分:2)

我不熟悉WiX,但您看到的属性替换似乎在解释here

在SQL Server中,可以使用引号而不是方括号作为标识符(请参阅here)。 E.g:

USE "master"
GO
/****** Object:  Database "DB_NAME"    Script Date: 02/23/2010 15:02:47 ******/
CREATE DATABASE "DB_NAME" COLLATE SQL_Latin1_General_CP1_CI_AS
GO

我看到你的脚本看起来已经生成但是想知道在生成它们之后是否可以对它们进行后处理,以便在运行Wix之前用引号替换标识符的所有方括号?