2016-03-14 21 views
8

UPDATE:Wix - SQL parentesi quadre in file binari

Mentre le risposte di seguito funzionano come soluzioni alternative, vorrei dire che il mio metodo iniziale fa nel lavoro fatto. Dopo aver esaminato le risposte di seguito, ho scoperto che la mia chiamata Session.Log() in realtà stava eliminando [...] quando veniva pubblicata nel file di registro. Le parentesi quadre sono rimaste nel mio SQL mentre le ho inserite nell'oggetto SQLCommand. Il mio problema in realtà era che l'SQL (di cui ho pubblicato solo le prime poche righe) aveva 'GO in esso, che non sono comandi SQL. Una volta che ho risolto il problema tutto ha funzionato :)

* (Un ricordo, la pubblicazione di quante più informazioni possibile, è sempre utile: D)


In Wix, ho file SQL memorizzata in elementi binari

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

ho quindi utilizzare un'azione personalizzata per tirare lo sql fuori dalla tabella di binario, e la stringa-sostituire il nome del database (fornito da una casella di testo nel programma di installazione)

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; 
     } 
    } 
01.235.

un'istruzione SQL esempio è come questo:

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 

Tuttavia, la stringa esco tavolo del 'binario' sembra tirare fuori tutto il contenuto [...] come se fossero proprietà WiX, così Sono rimasto con

C'è una bandiera che posso impostare per fare in modo che WiX non pensi che la sintassi SQL sia Proprietà WiX?

+0

Come una parte pensava, per la parte di registrazione del problema, è possibile memorizzare i contenuti che si desidera registrare in una proprietà. E poi, facoltativamente, registra una stringa che fa riferimento alla proprietà, ma poiché i log dettagliati già registrano i valori delle proprietà, puoi probabilmente saltare quella parte. –

risposta

5

Le parentesi quadre nel file binario devono essere sfuggite. Così

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 

Nota che si potrebbe usare questo a vostro vantaggio impostando una proprietà chiamata DB_NAME, che WiX sarebbe poi cambiare il nome del database effettivo.

L'altra opzione potrebbe essere quella di trattare il tutto come CDATA, ad es.

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

Ma io non sono veramente sicuro se avrebbe funzionato o no ...

Naturalmente, si potrebbe anche semplicemente non utilizzare la tabella Binary e invece confezionare i file in qualche altro modo. Inseriscili direttamente nella DLL di azioni personalizzate come risorsa ed estraili da lì, come in Can I embed other files in a DLL?.

+0

Nota, il CDATA non ha funzionato, ma l'embeded lo ha fatto. Avevo un bisogno personale per SQL di rimanere utilizzabile per più di un semplice wix, quindi i caratteri di escape e le opzioni CDATA non avrebbero funzionato per me personalmente, altri potrebbero avere esigenze diverse. – will

+0

Buono a sapersi - non ero così sicuro del CDATA per un elemento binario, lo so in altri posti come contenuto di elementi che potrebbe funzionare. –

2

Non ho familiarità con WiX ma la sostituzione di proprietà che si sta vedendo sembra essere spiegata here.

In SQL Server, è possibile utilizzare le virgolette anziché le parentesi quadre per gli identificatori (vedere here). Ad esempio:

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 

vedo i tuoi scritti sembrano essere stati generati, ma chiedo se sarebbe possibile alla post-processo di loro dopo che sono stati generati per sostituire tutte le parentesi quadre per gli identificatori tra virgolette prima esecuzione attraverso Wix ?

Problemi correlati