C# ataTable(表名); 类型installerType=Type.GetTypeFromProgID(“WindowsInstaller.Installer”); Installer安装程序=(WindowsInstaller.Installer)Ac
ataTable(表名); 类型installerType=Type.GetTypeFromProgID(“WindowsInstaller.Installer”); Installer安装程序=(WindowsInstaller.Installer)Activator.CreateInstance(installerType); Database Database=installer.OpenDatabase(msfile,MsiOpenDatabaseMode.msiopendatabasemoderedeadOnly); string sqlQuery=string.Format(“从{0}中选择*表名”); View=database.OpenView(sqlQuery); view.Execute(null); 记录名称=view.ColumnInfo[MsiColumnInfo.msiColumnInfoNames]; 记录类型=view.ColumnInfo[MsiColumnInfo.msiColumnInfoTypes]; 记录行=view.Fetch(); 对于(int index=1;indexC# ataTable(表名); 类型installerType=Type.GetTypeFromProgID(“WindowsInstaller.Installer”); Installer安装程序=(WindowsInstaller.Installer)Ac,c#,datatable,dataset,windows-installer,C#,Datatable,Dataset,Windows Installer,ataTable(表名); 类型installerType=Type.GetTypeFromProgID(“WindowsInstaller.Installer”); Installer安装程序=(WindowsInstaller.Installer)Activator.CreateInstance(installerType); Database Database=installer.OpenDatabase(msfile,MsiOpenDatabaseMode.msiopendatabase
public DataTable ReadMsiPropertyTable(string msiFile, string tableName)
{
Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
WindowsInstaller.Installer installer = (WindowsInstaller.Installer)Activator.CreateInstance(installerType);
Database database = installer.OpenDatabase(msiFile, 0);
string sqlQuery = String.Format("SELECT * FROM {0}",tableName);
View view = database.OpenView(sqlQuery);
view.Execute(null);
Record record = view.Fetch();
DataTable msiPropertyTable = new DataTable();
msiPropertyTable.Columns.Add("Column1", typeof(string));
msiPropertyTable.Columns.Add("Column2", typeof(string));
msiPropertyTable.Columns.Add("Column3", typeof(string));
msiPropertyTable.Columns.Add("Column4", typeof(string));
while (record != null)
{
int fieldCount;
fieldCount = record.FieldCount;
msiPropertyTable.Rows.Add(record.get_StringData(0), record.get_StringData(1), record.get_StringData(2), record.get_StringData(3));
record = view.Fetch();
}
return msiPropertyTable;
}
var db = new Database("path\to\MSI");
public static DataTable TableToDataTable( string msiPath, string tableName )
{
DataTable dataTable = null;
using(var database = new Database(msiPath, DatabaseOpenMode.ReadOnly))
{
using(var view = database.OpenView("SELECT * FROM `{0}`", tableName))
{
view.Execute();
dataTable = new DataTable(tableName);
foreach (var column in view.Columns)
{
dataTable.Columns.Add(column.Name, column.Type);
}
foreach (var record in view) using (record)
{
var row = dataTable.NewRow();
foreach (var column in view.Columns)
{
row[column.Name] = record[column.Name];
}
dataTable.Rows.Add(row);
}
}
}
return dataTable;
}
public static DataTable ReadMsiPropertyTable(string msiFile, string tableName)
{
DataTable dataTable = new DataTable(tableName);
Type installerType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
Installer installer = (WindowsInstaller.Installer)Activator.CreateInstance(installerType);
Database database = installer.OpenDatabase(msiFile, MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly);
string sqlQuery = String.Format("SELECT * FROM {0}", tableName);
View view = database.OpenView(sqlQuery);
view.Execute(null);
Record names = view.ColumnInfo[MsiColumnInfo.msiColumnInfoNames];
Record types = view.ColumnInfo[MsiColumnInfo.msiColumnInfoTypes];
Record row = view.Fetch();
for (int index = 1; index < names.FieldCount+1; index++)
{
string columnName = names.get_StringData(index);
string columnSpec = types.get_StringData(index);
switch (columnSpec.Substring(0, 1).ToLower())
{
case "s":
dataTable.Columns.Add(columnName, typeof(String));
break;
case "l":
dataTable.Columns.Add(columnName, typeof(String));
break;
case "i":
dataTable.Columns.Add(columnName, typeof(Int32));
break;
case "v":
dataTable.Columns.Add(columnName, typeof (Stream));
break;
}
}
while (row != null)
{
DataRow dataRow = dataTable.NewRow();
for (int index = 0; index < dataTable.Columns.Count; index++)
{
if(dataTable.Columns[index].DataType == typeof(String))
{
dataRow[index] = row.StringData[index + 1];
}
else if(dataTable.Columns[index].DataType == typeof(Int32))
{
dataRow[index] = row.IntegerData[index + 1];
}
else if(dataTable.Columns[index].DataType == typeof(Stream))
{
// Insanity has it's limits. Not implemented.
}
}
dataTable.Rows.Add(dataRow);
row = view.Fetch();
}
return dataTable;
}