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:
- durante la instalación, abra y edite el archivo sql a través de una acción personalizada
- 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;
}