0

問題に直面しています: MsiOpenDatabaseView() メソッドを使用して msi データベースの MsiAssembly および MsiAssemblyName テーブルにエントリを追加すると、エラー コード 1615 で失敗します。これは、これら 2 つのテーブルのみの場合です。最初は、アプリケーションの種類を .NET に変更しなかったことが原因だと思いました。しかし、それを変更した後も機能しません。次に、MsiAssembly および MsiAssemblyName テーブルのエントリの _Validation テーブルを更新してみました。それもうまくいきません。おそらく、MsiAssembly および MsiAssembly テーブルにレコードを入力するのを妨げている依存関係が不足しています。この問題について手がかりやヒントを教えてもらえますか?????? ありがとう。

4

1 に答える 1

0

エラー1615は「SQLクエリ構文が無効またはサポートされていません」です。クエリが表示されない場合、最初の推測では、編集しようとしている.msiファイルにテーブルが存在しないか、Windowsインストーラ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 に答える