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

前端之家收集整理的这篇文章主要介绍了sql-server – Wix – 二进制文件中的SQL方括号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
更新:

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

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

在Wix中,我将sql文件存储在二进制元素中

  1. <Binary Id="sqlStep1" SourceFile="SourceDir\Step1_sql_Build.sql"></Binary>
  2. <Binary Id="sqlStep2a" SourceFile="SourceDir\Step2a_sql_Build.sql"></Binary>
  3. <Binary Id="sqlStep2b" SourceFile="SourceDir\Step2b_sql_Build_sp_iv6Login.sql"></Binary>
  4. <Binary Id="sqlStep2c" SourceFile="SourceDir\Step2c_sql_Grant.sql"></Binary>

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

  1. private static string ReplaceDBName(Session session,string binaryKeyName)
  2. {
  3. View v = session.Database.OpenView("SELECT Data FROM Binary WHERE Name = '{0}'",binaryKeyName);
  4. v.Execute();
  5. Record r = v.Fetch();
  6.  
  7. using (StreamReader reader = new StreamReader(r.GetStream("Data")))
  8. {
  9. string text = reader.ReadToEnd();
  10. text = text.Replace(@"DB_NAME",session["DATABASE_NAME"]);
  11. session.Log("Running sql: " + text);
  12. return text;
  13. }
  14. }

一个示例sql语句是这样的:

  1. USE [master]
  2. GO
  3. /****** Object: Database [DB_NAME] Script Date: 02/23/2010 15:02:47 ******/
  4. CREATE DATABASE [DB_NAME] COLLATE sql_Latin1_General_CP1_CI_AS
  5. GO

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

  1. USE
  2. GO
  3. /****** Object: Database Script Date: 02/23/2010 15:02:47 ******/
  4. CREATE DATABASE COLLATE sql_Latin1_General_CP1_CI_AS
  5. GO

有没有我可以设置的标志让WiX不认为sql语法是WiX属性

解决方法

二进制文件中的方括号必须转义.所以
  1. USE \[master\]
  2. GO
  3. /****** Object: Database \[DB_NAME\] Script Date: 02/23/2010 15:02:47 ******/
  4. CREATE DATABASE \[DB_NAME\] COLLATE sql_Latin1_General_CP1_CI_AS
  5. GO

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

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

  1. <![CDATA[USE [master]
  2. GO
  3. /****** Object: Database [DB_NAME] Script Date: 02/23/2010 15:02:47 ******/
  4. CREATE DATABASE [DB_NAME] COLLATE sql_Latin1_General_CP1_CI_AS
  5. GO]]>

但我不确定这是否有效……

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

猜你在找的MsSQL相关文章