2016-03-14 8 views
8

UPDATE:ウィックス - バイナリファイル内のSQL四角カッコ

以下の回答が代替ソリューションとして仕事をしている間、私は私の最初の方法は、実際の作業ではないことに言及したいと思います。以下の答えを見直した後、私はSession.Log()呼び出しが実際にログファイルに投稿されたときに[...]を取り除いていることを知りました。角括弧はSQLCommandオブジェクトに渡されたときにSQLに残っていました。私の実際の問題は、SQL(そのうちの最初の数行しか掲載していない)が、SQLコマンドではない「GO」を持っていたことでした。私はその問題を解決したら、すべてが働いた:)

を*(リマインダーは、できるだけ多くの情報を掲載することは常に有用である:D)


をウィックスでは、私は2進要素

に保存された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がWiXのプロパティではないと思うように設定できるフラグはありますか?

+0

問題のロギング部分については、ログインする内容をプロパティに格納することができます。オプションでプロパティを参照する文字列をログに記録することもできますが、冗長ログにはすでにプロパティ値が記録されているので、おそらくその部分をスキップできます。 –

答えて

5

バイナリ内の角括弧はエスケープする必要があります。ですから、WiXのは、あなたの実際のデータベース名に変更しますDB_NAMEというプロパティを設定することによって、あなたの利点にこれを使用することができ

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 

注意。

あなたの他の選択肢は、全体を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?のようにそこから引き出します。

+0

CDATAは機能しませんでしたが、埋め込まれました。私はSQLが個人的に私のために働いていなかったので、エスケープされた文字と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 

関連する問題