我想检查数据表中是否存在特定行。
例如,我想检查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.
}
}
我有一个结构为(“TableName”,“ColumnNAme1”,“ColumnName2”,“ColumnName1的值”)的数据表。所以对于上面的记录,行就像(“属性”,“属性”,“值”,“ARPNOMODIFY”),我想返回值1,因为ARPNOMODIFY存在且其值为1.
现在考虑另一行(“Property”,“Propery”,“Value”,“ICFAGREE”)。现在如果Property表中不存在ICFAGREE属性,那么我想返回空字符串。 提前谢谢。
另请考虑另一行(“AdminExecuteSequence”,“Action”,“Condition”,“SetSpecifiedDir”)。现在,在此示例中,AdminExecuteSequence表具有Action和Condition列。 Action列下的值之一是“SetSpecifiedDir”,因此它在“Condition”列下的相应值是“ORCADIR”。所以我想返回“ORCADIR”这个字符串,如果AdminExecuteSequence表中存在“SetSpecifiedDir”值,否则我将返回null
答案 0 :(得分:1)
DTF有丰富的类来帮助您进行这些测试。
Also see: MSI Tip: Authoring an ICE using C# / DTF
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;
}
}
}
答案 1 :(得分:0)
有用于检索属性值的API:MsiGetProperty
编辑:要查询是否存在任何表格,您可以使用MsiDatabaseGetPrimaryKeys。