2016-03-14 4 views
8

UPDATE:Wix - SQL квадратные скобки в бинарных файлах

Хотя ответы ниже работают в качестве альтернативных решений, которые я хотел бы упомянуть, что мой первоначальный метод делает на самом деле работы. Просмотрев ответы ниже, я узнал, что мой вызов 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 

Однако строка я получаю из таблицы «Binary», кажется, вытащить все содержимое [...], как они были WIX Properties, так Я остался с

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?

+0

Как было указано, для части ведения журнала проблемы вы можете сохранить содержимое, которое хотите войти в свойство. А затем, при необходимости, запишите строку, ссылающуюся на свойство, но поскольку verbose logs уже регистрируют значения свойств, вы, вероятно, можете пропустить эту часть. –

ответ

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]]> 

Но я не совсем уверен, если это будет работать или нет ...

Конечно, вы также можете просто не использовать Binary таблицу, а вместо этого упаковать файлы каким-либо другим способом. Вставьте их непосредственно в DLL настраиваемого действия в качестве ресурса и вытащите их оттуда, например, в Can I embed other files in a DLL?.

+0

Обратите внимание, что CDATA не работает, но встроенный. У меня была личная потребность в том, чтобы SQL оставался пригодным для использования не только для wix, поэтому экранированные символы и параметры CDATA не работали бы лично для меня, у других могли бы быть разные потребности. – will

+0

Приятно слышать - я не был так уверен в CDATA для двоичного элемента, я знаю, что в других местах это может быть элементный контент. –

2

Я не знаком с WiX, но замещение собственности, которое вы видите, объясняется here.

В SQL Server кавычки могут использоваться вместо квадратных скобок для идентификаторов (см. here). Например:

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 ?

Смежные вопросы