2016-03-14 71 views
8

UPDATE:維克斯 - SQL方括號中的二進制文件

雖然答案下面做工作作爲替代解決方案,我想提一提,我最初的方法是實際可行的。在查看下面的答案之後,我發現Session.Log()調用實際上在發佈到日誌文件時剝離了它。當我將它提交到SQLCommand對象時,方括號仍保留在我的SQL中。我的問題是SQL(我只發佈了前幾行)中有'GO',它不是SQL命令。一旦我解決了這個問題一切工作:)

*(提醒一下,發佈儘可能多的信息可能總是有益的:d)


在維克斯,我已經存儲在二進制元素

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 

有一個標誌,我可以設置讓維克斯沒有想到的SQL語法是維克斯屬性?

+0

作爲一個側面的想法,對於問題的日誌記錄部分,您可以存儲您想要登錄到屬性的內容。然後可以選擇記錄一個引用該屬性的字符串,但由於詳細日誌已經記錄了屬性值,因此可以跳過該部分。 –

回答

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屬性,它會維克斯然後更改爲實際的數據庫名稱中使用你的優勢。

您的其他選擇可能是將整個事物視爲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保持不僅僅是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 

我看到你的腳本看起來像已經產生,他們會想,如果有可能進行後期處理他們,他們有生成維克斯運行前全部更換方括號與引號標識符後?