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

标签 sql-server wix

更新:

虽然下面的答案确实可以作为替代解决方案,但我想提一下,我最初的方法实际上确实有效。查看下面的答案后,我发现我的 Session.Log() 调用实际上在发布到日志文件时剥离了 [ ... ] 。当我将其输入 SQLCommand 对象时,方括号仍保留在 SQL 中。我的实际问题是 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 属性吗?

最佳答案

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

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? 中那样。 .

关于sql-server - Wix - 二进制文件中的 SQL 方括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996678/

相关文章:

sql - MS SQL - 选择记录子集的问题

sql-server - 在获取错误信息的同时获取列名

SQL - 仅显示具有最新日期的行

vb6 - WiX 安装的 tabctl32.msm 未注册 ocx

wix - 更改 WiX 的 INSTALLFOLDER 值

installation - Wix-Installer-如何获取 setup.exe 的当前目录?

WiX ServiceInstall - 设置服务以当前 Windows 用户身份运行

visual-studio-2012 - WIX Burn 自定义安装页面

sql - 大表中的行数

sql - 数据库的事务日志已满