Component File /DBUtil/DBSchema.cs (C#)
using System;  
using System.Data;  
using System.Data.OleDb;  
using System.Windows.Forms;  
using System.Collections;  
  
namespace YariSoft.DBUtil  
{  
    public class SchemaGenerator  
    {  
        #region Local variables  
        private DataSet _schema = null;  
        private DataTable _tables = null;  
        private Hashtable _adapters = null;  
        #endregion  
  
        #region Properties  
        public DataSet Schema  
        {  
            get{ return this._schema; }  
        }  
  
        public DataTable Tables  
        {  
            get{ return this._tables ; }  
        }  
  
        public Hashtable Adapters  
        {  
            get{ return this._adapters ; }  
        }  
  
  
        #endregion  
  
        #region Constructor/Destructor  
        public SchemaGenerator()  
        {  
            this._schema = new DataSet();  
            this._adapters = new Hashtable();  
        }  
  
        ~SchemaGenerator()  
        {  
            this.Dispose();  
        }  
  
        public void Dispose()  
        {  
            if( this._schema != null ){  
                this._schema.Dispose();  
            }  
            if( this._tables != null ){  
                this._tables.Dispose();  
            }  
            if( this._adapters != null ){  
                foreach ( YOleDbAdapter adapter in this._adapters.Values ){  
                    adapter.Dispose();  
                }  
            }  
        }  
        #endregion  
  
        #region Public functions  
        public bool BuildSchema( OleDbConnection Connection )  
        {  
            bool status = true;  
  
            ConnectionState previousConnectionState = Connection.State;  
            try{  
                if( previousConnectionState == ConnectionState.Closed ){  
                    Connection.Open();  
                }  
                this._schema.Relations.Clear();  
                foreach( DataTable table in this._schema.Tables ){  
                    for( int i = table.Constraints.Count - 1; i >= 0; i-- ){  
                        if( table.Constraints[i] is ForeignKeyConstraint ){  
                            table.Constraints.Remove(table.Constraints[i]);  
                        }  
                    }  
                }  
                this._schema.Tables.Clear();  
  
                this._tables = Connection.GetOleDbSchemaTable( OleDbSchemaGuid.Tables,  
                                                                        new object[] {null, null, null, "TABLE"});  
                this._tables.TableName = "__YS_Tables_Internal";  
                foreach ( DataRow Row in this._tables.Rows ){  
                    if( ! this.AddTable( Connection, ( string )Row["TABLE_NAME"]) ){  
                        status = false;  
                        break;  
                    }  
                }  
                this._schema.EnforceConstraints = false;  
                if( status ){  
                    status = this.AddConstraints( Connection );  
                }  
  
            } catch( Exception Exp ) {  
                YariSoft.Utils.YMessages.Show( Exp.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );  
                status = false;  
            }  
  
            if( previousConnectionState == ConnectionState.Closed ){  
                Connection.Close();  
            }  
            return status;  
        }  
        #endregion  
  
        #region Private functions  
        private bool AddTable( OleDbConnection Connection, string TableName )  
        {  
            try {  
                System.Data.OleDb.OleDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter( "SELECT * FROM ["+ TableName +"] Where 2 < 1", Connection );  
                DataTable[] tables = dataAdapter.FillSchema( this._schema, System.Data.SchemaType.Source );  
                foreach ( DataTable table in tables ){  
                    table.TableName = TableName;  
                }  
                dataAdapter.Dispose();  
            } catch(Exception Exp ) {  
                YariSoft.Utils.YMessages.Show( Exp.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );  
                return false;  
            }  
  
            return true;  
        }  
  
        private bool AddConstraints( OleDbConnection Connection )  
        {  
            bool status = true;  
            DataTable constraints = null;  
            try {  
                constraints = Connection.GetOleDbSchemaTable( OleDbSchemaGuid.Foreign_Keys, new object[] {});  
                foreach ( DataRow row in constraints.Rows ){  
                    DataColumn pCol = this._schema.Tables[row["PK_TABLE_NAME"].ToString()].Columns[row["PK_COLUMN_NAME"].ToString()];  
                    DataColumn fCol = this._schema.Tables[row["FK_TABLE_NAME"].ToString()].Columns[row["FK_COLUMN_NAME"].ToString()];  
                    this._schema.Relations.Add( row["FK_NAME"].ToString(), pCol, fCol );  
                }  
            } catch(Exception Exp ) {  
                YariSoft.Utils.YMessages.Show( Exp.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error );  
                status = false;  
            }  
  
            if( constraints != null ){  
                constraints.Dispose();  
            }  
            return status;  
        }  
        #endregion  
    }  
}