0

特定の行がデータテーブルに存在するかどうかを確認したい。

たとえば、プロパティ テーブルが msi データ テーブルに存在するかどうかを確認したい。存在する場合は、「プロパティ」列と「値」列が存在するかどうかを確認したいと思います。両方が存在する場合、プロパティ「ARPNOMODIFY」が存在するかどうかを確認します。

                if (database.Tables.Contains("Property"))
                {
                    if (database.Tables["Property"].Columns.Contains("Property"))
                    {
                        // here I want to checked if "ARPNOMODIFY" or any other property exists or not. If it exists then I want its value.
                    }
                }

次のような構造を持つ 1 つのデータ テーブルがあります ("TableName","ColumnNAme1","ColumnName2","ColumnName1 の値")。したがって、上記のレコードの場合、行は ("Property","Property","Value","ARPNOMODIFY") のようになり、ARPNOMODIFY が存在し、その値が 1 であるため、Value 1 を返したいと考えています。

次に、別の行を ("Property","Propery","Value","ICFAGREE") とします。ICFAGREE プロパティがプロパティ テーブルに存在しない場合は、null 文字列を返します。前もって感謝します。

別の行 ("AdminExecuteSequence"、"Action"、"Condition"、"SetSpecifiedDir") も検討してください。この例では、AdminExecuteSequence テーブルに Action 列と Condition 列があります。Action列の値の1つは「SetSpecifiedDir」であるため、「Condition」列の対応する値は「ORCADIR」です。したがって、この文字列「ORCADIR」を返したいのですが、「SetSpecifiedDir」値がAdminExecuteSequenceテーブルに存在する場合、またはそうでない場合はnullを返します.

4

2 に答える 2

1

DTF には、このような種類のテストを行うのに役立つ豊富なクラスがあります。

参照: MSI ヒント: C# / DTF を使用した ICE の作成

   using System;
    using Microsoft.Deployment.WindowsInstaller;

    namespace ConsoleApplication1
    {
        class Tester : IDisposable
        {
            Database _database;

            public Tester(string databasePath)
            {
                _database = new Database(databasePath, DatabaseOpenMode.ReadOnly);
            }

            public void Dispose()
            {
                _database.Dispose();
            }

            public bool HasTable(string tableName)
            {
                return _database.Tables.Contains(tableName);
            }

            public bool HasColumn(string tableName, string columnName)
            {
                bool columnExists = false;
                if (HasTable(tableName))
                {
                    columnExists = _database.Tables[tableName].Columns.Contains(columnName);
                }
                return columnExists;
            }


            public bool QueryReturnsData(string sqlStatement, params object[] args)
            {
                return QueryReturnsData(string.Format(sqlStatement, args));
            }

            public bool QueryReturnsData(string sqlStatement)
            {
                bool containsData = false;
                using (View view = _database.OpenView(sqlStatement))
                {
                    view.Execute();
                    using (Record rec = view.Fetch())
                    {
                        if(rec != null )
                        {
                            containsData = true;
                        }
                    }
                }
                return containsData;

            }

        }
    }
于 2013-01-11T18:58:20.893 に答える
0

プロパティ値を取得するための API があります: MsiGetProperty

編集:テーブルが存在するかどうかを照会するには、MsiDatabaseGetPrimaryKeysを使用できます。

于 2013-01-11T06:51:30.660 に答える