error: 1615 al ingresar registros en las tablas MsiAssembly y MsiAssemblyName en la base de datos msi

Tengo un problema: al agregar entradas a la tabla MsiAssembly y MsiAssemblyName de la base de datos msi usando el método MsiOpenDatabaseView(), simplemente está fallando con el código de error - 1615. Este es el caso solo con estas dos tablas. Al principio pensé que sería debido a que no cambié el tipo de aplicación a .NET. pero después de cambiar eso tampoco funciona. Luego intenté actualizar la tabla _Validation para las entradas de las tablas MsiAssembly y MsiAssemblyName. Tampoco funcionó. Probablemente me estoy perdiendo alguna dependencia que impide que los registros se ingresen en MsiAssembly y MsiAssembly Tables. me pueden dar alguna pista o pista sobre este problema?????? Gracias.

preguntado el 03 de mayo de 12 a las 17:05

1 Respuestas

El error 1615 es "Sintaxis de consulta SQL no válida o no admitida". Sin ver su consulta, mis primeras conjeturas serían que la tabla no está presente en el archivo .msi que está tratando de editar, o que está tratando de hacer algo que la sintaxis SQL de Windows Installer no admite correctamente. (Para consultas complicadas, prefiero usar actualizaciones basadas en registros a través de MsiVewModify() donde sea posible.)

Para la inserción en su mensaje de error, puede verificar que la tabla existe verificando

MsiDatabaseIsTablePersistent(hDatabase, TEXT("MsiAssembly")) == MSICONDITION_TRUE

Si no es así, puede agregarlo, ya sea a través de una llamada a MsiDatabaseImport (pasarle un archivo creado desde MsiDatabaseExport), o a través del correcto CREATE TABLE ... Consulta SQL.

Entonces preferiría insertar código a lo largo de las líneas de lo siguiente (se eliminó la verificación de errores para mayor claridad). Puede proporcionar información de error en varios pasos a lo largo del camino en lugar de agruparlos en la llamada MsiViewExecute del enfoque de SQL sin procesar.

PMSIHANDLE hView, hRec;
MsiDatabaseOpenView(hDatabase, TEXT("SELECT * FROM `MsiAssembly`"), &hView);
MsiViewExecute(hView, NULL);
hRec = MsiCreateRecord(5);
MsiRecordSetString(hRec, 1, TEXT("Abc.dll"));
MsiRecordSetString(hRec, 2, TEXT("MainApp"));
MsiRecordSetString(hRec, 3, TEXT("Abc"));
MsiRecordSetString(hRec, 4, TEXT(""));
MsiRecordSetInteger(hRec, 5, 0);
// note: if modifying during installation, use MSIMODIFY_INSERT_TEMPORARY instead
MsiViewModify(hView, MSIMODIFY_INSERT, hRec);

contestado el 09 de mayo de 12 a las 12:05

Llamar a MsiGetLastErrorRecord para obtener detalles adicionales y pasar el identificador resultante a MsiFormatRecord da como resultado lo siguiente: 1: 2228 2: F:\Source\Mymsi.msi 3: MsiAssembly 4: INSERT INTO MsiAssembly (MsiAssembly.Component_, MsiAssembly.Feature_, MsiAssembly.File_Manifest, MsiAssembly.File_Application, MsiAssembly.Attributes) VALORES ('Abc.dll','MainApp','Abc','', 0) 2228: significa tabla desconocida pero la tabla está presente en la base de datos msi. - dev

Tengo la razón de este error. En la base de datos msi, si algunas tablas no están inicializadas (vacías) e intentamos insertar registros en ellas, obtenemos un mensaje de error: 2228: la tabla es desconocida o no existe. pero si de alguna manera (usando wise for windows installer, wix, etc.) ponemos un registro ficticio en la tabla. El problema se resolverá. No sé la razón de esto. pero es el caso la mayoría de las veces. Si alguien explica esto sería de mucha ayuda. - dev

Parece que confirmó mi corazonada: la tabla en realidad no existe en su MSI integrado. (Tal vez sabio elimina mesas vacías.) - miguel urman

tiene razón antes de insertar cualquier registro en las tablas msi, primero debemos confirmar si la tabla existe o no. pero la pregunta es ¿por qué este es el caso con solo unas pocas tablas msi? ¿También puede decirme alguna función del instalador o alguna técnica que inicialice una tabla msi vacía? - dev

Hay dos formas de agregar una tabla. Uno es a través de MsiDatabaseImport; el otro es a través de SQL y MsiDatabaseOpenView y MsiViewExecute. - miguel urman

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.