usuarios una subir suban que para pagina los hacer como archivos archivo wix wix3.5 wix3.6 wix-extension wixlib

subir - como hacer una pagina para que los usuarios suban archivos wix



WIX edita el archivo binario en acción personalizada (1)

Estoy tratando de hacer lo siguiente:

  1. durante la instalación, abra y edite el archivo sql a través de una acción personalizada
  2. guarde los cambios editados y ejecútelo durante la instalación.

En mi product.wxs tengo lo siguiente:

<Binary Id="SqlScriptSQLAuthentication" SourceFile="$(sys.SOURCEFILEDIR)/MyDb.sql" /> <Component Id=''SqlComponent.SQLAuthentication'' Guid=''665D641C-3570-4b96-9CA5-2B4C12594A35'' KeyPath=''yes''> <Condition><![CDATA[USEINTEGRATEDSECURITY<>1]]></Condition> <sql:SqlDatabase Id=''SqlDatabase.SQLAuthentication'' Database=''[DATABASE_NAME]'' User=''SQLUser'' Server=''[DATABASE_SERVER]'' CreateOnInstall=''yes'' DropOnUninstall=''yes'' ContinueOnError=''no'' /> <sql:SqlScript Id=''SqlScriptSQLAuthentication'' BinaryKey=''SqlScriptSQLAuthentication'' SqlDb=''SqlDatabase.SQLAuthentication'' ExecuteOnInstall=''yes'' /> </Component>

Durante la configuración, deseo editar "MyDb.sql", escribir los cambios en él y guardarlo de nuevo, para que wix pueda ejecutarlo durante la instalación.

¿Cuál es el mejor enfoque? Gracias

EDITAR:

Archivo MyDb.sql:

CREATE TABLE Test12345 (Value1 CHAR(50), Value2 INTEGER)

En mi acción personalizada tengo lo siguiente:

View v = session.Database.OpenView("SELECT `Data` FROM `Binary` WHERE `Name` = ''{0}''", binaryKeyName); v.Execute(); var IsReadOnly = session.Database.IsReadOnly; Record r = v.Fetch(); StreamReader reader = new StreamReader(r.GetStream("Data")); string text = reader.ReadToEnd(); text = text.Replace(@"Test12345", "TTTest"); byte[] byteArray = Encoding.ASCII.GetBytes(text); MemoryStream stream = new MemoryStream(byteArray); r.SetStream("Data", stream);

// Hasta este punto funciona y leo mi texto sql desde el archivo .sql

session.Database.ExecuteStringQuery("UPDATE `Binary` SET `Data` = ''{0}'' WHERE `Name` = ''{1}'')", text, binaryKeyName); v.Close(); session.Database.Commit();

es cuando intento actualizar (no estoy seguro de si voy bien) falla.


Puede usar esta acción personalizada para extraer los datos binarios. Tendría que hacer sus cambios y volver a guardarlo. No estoy seguro de cómo volver a guardarlo en binario ya que no lo he hecho antes. Lo he usado para transmitir datos temporales al acuerdo de licencia. Esto debería darte un buen comienzo.

HRESULT ExtractBinary(__in LPCWSTR wzBinaryId, __out BYTE** pbData, __out DWORD* pcbData) { HRESULT hr = S_OK; LPWSTR pwzSql = NULL; PMSIHANDLE hView; PMSIHANDLE hRec; // make sure we''re not horked from the get-go hr = WcaTableExists(L"Binary"); if (S_OK != hr) { if (SUCCEEDED(hr)) { hr = E_UNEXPECTED; } ExitOnFailure(hr, "There is no Binary table."); } ExitOnNull(wzBinaryId, hr, E_INVALIDARG, "Binary ID cannot be null"); ExitOnNull(*wzBinaryId, hr, E_INVALIDARG, "Binary ID cannot be empty string"); hr = StrAllocFormatted(&pwzSql, L"SELECT `Data` FROM `Binary` WHERE `Name`=/'%s/'", wzBinaryId); ExitOnFailure(hr, "Failed to allocate Binary table query."); hr = WcaOpenExecuteView(pwzSql, &hView); ExitOnFailure(hr, "Failed to open view on Binary table"); hr = WcaFetchSingleRecord(hView, &hRec); ExitOnFailure(hr, "Failed to retrieve request from Binary table"); hr = WcaGetRecordStream(hRec, 1, pbData, pcbData); ExitOnFailure(hr, "Failed to read Binary.Data."); LExit: ReleaseStr(pwzSql); return hr; }