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

обновление:

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

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 ответов


квадратные скобки в двоичном файле должны быть экранированы. Так что

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 действий в качестве ресурса и вытащить их оттуда, как в можно ли вставлять другие файлы в DLL?.


Я не знаком с WiX, но подстановка свойств, которую вы видите, кажется, объясняется здесь.

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

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?