Ejemplo n.º 1
0
        public TableBinding Add(DataTable dataTable)
        {
            if (dataTable == null)
            {
                throw ExceptionBuilder.ArgumentNull("dataTable");
            }

            DataTableBinding tableBinding = new DataTableBinding(dataTable);

            Add(tableBinding);
            return(tableBinding);
        }
Ejemplo n.º 2
0
        public static DataTableBinding Bind(this DataTable table)
        {
            var result = new DataTableBinding {
                Rows = new List <string[]>()
            };

            foreach (DataRow row in table.Rows)
            {
                string[] r = new string[table.Columns.Count];
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    r.SetValue(row[i].ToString(), i);
                }

                result.Rows.Add(r);
            }

            return(result);
        }
Ejemplo n.º 3
0
        private static void ReadAllTables(DataContext dataContext, string pathToMsiFile)
        {
            IntPtr databaseHandle;
            int    openFlags = Msi.MsiDbPersistMode_ReadOnly;

            if (Path.GetExtension(pathToMsiFile).Equals(".msp", StringComparison.InvariantCultureIgnoreCase))
            {
                openFlags += Msi.MsiDbPersistMode_PatchFile;
            }

            Msi.OpenDatabase(pathToMsiFile, openFlags, out databaseHandle);
            try
            {
                // Read table metadata table.
                DataTable tableDataTable = ReadTable(databaseHandle, "_Tables");
                // NOTE: The metadata table itself is not listed in _Tables.
                dataContext.Tables.Add(tableDataTable);

                foreach (DataRow row in tableDataTable.Rows)
                {
                    string    tableName = (string)row["Name"];
                    DataTable table     = ReadTable(databaseHandle, tableName);
                    dataContext.Tables.Add(table);
                }

                // Add relations as described in the _Validation metadata table.

                DataTableBinding validationTableBinding = (DataTableBinding)dataContext.Tables["_Validation"];
                if (validationTableBinding != null)
                {
                    foreach (DataRow dataRow in validationTableBinding.DataTable.Rows)
                    {
                        if (dataRow.IsNull("KeyTable"))
                        {
                            continue;
                        }

                        string   tableName       = (string)dataRow["Table"];
                        string   columnName      = (string)dataRow["Column"];
                        string[] keyTablesNames  = ((string)dataRow["KeyTable"]).Split(';');
                        int      keyColumnNumber = (int)dataRow["KeyColumn"];

                        foreach (string keyTableName in keyTablesNames)
                        {
                            if (dataContext.Tables[tableName] != null)
                            {
                                TableBinding keyTable = dataContext.Tables[keyTableName];
                                if (keyTable != null && keyColumnNumber >= 1 && keyColumnNumber <= keyTable.Columns.Count)
                                {
                                    string keyColumnName = keyTable.Columns[keyColumnNumber - 1].Name;
                                    dataContext.TableRelations.Add(tableName, new string[] { columnName }, keyTableName, new string[] { keyColumnName });
                                }
                            }
                        }
                    }
                }
            }
            finally
            {
                Msi.CloseHandle(databaseHandle);
            }
        }