sql-server – Wix – 二进制文件中的SQL方括号
更新:
虽然下面的答案可以作为替代解决方案,但我想提一下,我的初始方法确实有效.在查看下面的答案后,我发现我的Session.Log()调用实际上是在发布到日志文件时剥离[…].方括号保留在我的SQL中,因为我将其输入SQLCommand对象.我的实际问题是SQL(我只发布了前几行)中有’GO’,它不是SQL命令.一旦我解决了这个问题一切正常:) *(提醒一下,发布尽可能多的信息总是有帮助的:D) 在Wix中,我将SQL文件存储在二进制元素中 <Binary Id="SQLStep1" SourceFile="SourceDirStep1_SQL_Build.sql"></Binary> <Binary Id="SQLStep2a" SourceFile="SourceDirStep2a_SQL_Build.sql"></Binary> <Binary Id="SQLStep2b" SourceFile="SourceDirStep2b_SQL_Build_sp_iv6Login.sql"></Binary> <Binary Id="SQLStep2c" SourceFile="SourceDirStep2c_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?中一样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |