0

我遇到了问题:在使用 MsiOpenDatabaseView() 方法向 msi 数据库的 MsiAssembly 和 MsiAssemblyName 表添加条目时,它只是失败并出现错误代码 - 1615。只有这两个表就是这种情况。起初我认为这将是由于我将应用程序类型更改为 .NET 的原因。但是在改变之后它也不起作用。然后我尝试为 MsiAssembly 和 MsiAssemblyName 表的条目更新 _Validation 表。它也很有效。可能我错过了一些阻碍在 MsiAssembly 和 MsiAssembly 表中输入记录的依赖项。你能给我一些关于这个问题的线索或提示吗??????谢谢。

4

1 回答 1

0

错误 1615 是“SQL 查询语法无效或不受支持”。在没有看到您的查询的情况下,我的第一个猜测是该表不存在于您尝试编辑的 .msi 文件中,或者您正在尝试执行 Windows Installer SQL 语法不正确支持的操作。(对于复杂的查询,我更喜欢MsiVewModify()尽可能使用基于记录的更新。)

对于错误消息中的插入,您可以通过验证来验证表是否存在

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

如果没有,您可以通过调用MsiDatabaseImport(向其传递从 MsiDatabaseExport 创建的文件)或通过正确的CREATE TABLE ...SQL 查询来添加它。

然后我更喜欢按照以下行插入代码(为清楚起见,省略了错误检查)。它可以在沿途的几个步骤中提供错误信息,而不是将所有信息集中到原始 SQL 方法的 MsiViewExecute 调用中。

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);
于 2012-05-03T23:49:29.243 回答