2017-11-17 10 views
1

MsiViewFetchを使用すると、SQLクエリからmsiにレコードを取得できます。 しかし、ファイルテーブルmsiに次のレコードが存在するかどうか、または行/レコードの数を確認する定数または関数がありますか?次のレコードがmsiファイルに存在するかどうかをチェックする方法は?

+0

この3つの異なる言語にタグを付けました。どちらが答えを求めていますか? –

答えて

3

いいえWindowsインストーラーのSQLの実装はかなり制限されています。利用可能なのは、ERROR_NO_MORE_ITEMSを返すまで、MsiViewFetchを繰り返し呼び出すオプションです。一度すべてのレコードを取得したら、それを実行します。途中で数を追跡し、返されたすべてのオブジェクトを適切に処理することは、あなた次第です。たとえば、正常に返された各レコードはMsiCloseHandleで閉じなければならず、通常はビュー自体をMsiViewCloseで終了する必要があります。

前述のように、これはラップアラートによって異なる表現が可能です。たとえば、WindowsインストーラオートメーションインターフェイスのView.Fetchメソッドは、すべてのレコードを既に取得している場合はNothingを返します。リソースのクリーンアップは、通常、問題の言語の規則を使用するように変更されています。

特に、Pythonのmsilibは、Python独自のインストーラの作成をサポートするために特別に実装されたWindowsインストーラ機能のラッパーです。それは汎用目的のために意図されていなかったので、他のラッパーのクリーチャーの快適さに欠けています。 implementation of View.Fetchは、不成功の戻りコードをMSIErrorに変換し、ERROR_NO_MORE_ITEMSERROR_SUCCESSではないことがわかります。したがって、あなたの使用のためには、MSIErrorを捕まえてERROR_NO_MORE_ITEMSのためにするか、の例外の文字列をチェックしてください。

+0

私はPythonで以下のコードを試しましたが、失敗しています。 – user2331760

+0

https://bugs.python.org/file47271/MSIFileRead.py – user2331760

+0

C#などの言語には、これを抽象化するサードパーティのライブラリがあります。それでなぜ私は言語について尋ねたのですか? –

関連する問題