}//public int LoadFromOracle( System.Data.IDbConnection myConn )

        /// <summary>
        /// 从 SQLServer 中加载数据库结构信息
        /// </summary>
        /// <param name="myConn">数据库连接对象</param>
        /// <returns>加载的字段信息个数</returns>
        public int LoadFromSQLServer(IDbConnection myConn)
        {
            intFillStyle = FillStyleConst.SQLServer;
            int RecordCount = 0;

            if (myConn is OleDbConnection)
            {
                strName = ((OleDbConnection)myConn).DataSource;
            }
            else if (myConn is System.Data.SqlClient.SqlConnection)
            {
                strName = ((System.Data.SqlClient.SqlConnection)myConn).DataSource;
            }
            strName = strName + " - " + myConn.Database;

            string strSQL = null;

            strSQL = @"
select
	sysobjects.name ,
	syscolumns.name  ,
	systypes.name ,
	syscolumns.length , 
	syscolumns.isnullable ,
	sysobjects.type
from 
	syscolumns,
	sysobjects,
	systypes 
where 
	syscolumns.id=sysobjects.id 
	and syscolumns.xusertype=systypes.xusertype 
	and (sysobjects.type='U' or sysobjects.type='V' )
	and systypes.name <>'_default_' 
	and systypes.name<>'sysname' 
order by 
	sysobjects.name,
	syscolumns.name"    ;
            myTables.Clear();
            try
            {
                using (System.Data.IDbCommand myCmd = myConn.CreateCommand())
                {
                    if (myConn.State != ConnectionState.Open)
                    {
                        myConn.Open();
                    }
                    myCmd.CommandText = strSQL;
                    IDataReader myReader  = myCmd.ExecuteReader(CommandBehavior.SingleResult);
                    TableInfo   LastTable = null;
                    while (myReader.Read())
                    {
                        string TableName = myReader.GetString(0).Trim();
                        if (LastTable == null || LastTable.Name != TableName)
                        {
                            LastTable = new TableInfo();
                            myTables.Add(LastTable);
                            LastTable.Name = TableName;
                            LastTable.Tag  = Convert.ToString(myReader.GetValue(5));
                        }
                        FieldInfo NewField = new FieldInfo();
                        LastTable.Fields.Add(NewField);
                        NewField.Name       = myReader.GetString(1);
                        NewField.FieldType  = myReader.GetString(2);
                        NewField.FieldWidth = myReader[3].ToString();
                        if (myReader.IsDBNull(4) == false)
                        {
                            NewField.Nullable = (myReader.GetInt32(4) == 1);
                        }
                        RecordCount++;
                    }//while
                    myReader.Close();
                    // 加载主键信息
                    for (int iCount = myTables.Count - 1; iCount >= 0; iCount--)
                    {
                        TableInfo myTable = myTables[iCount];

                        int aa = string.Compare((string)myTable.Tag, "U", true);
                        if (string.Compare((string)myTable.Tag, "U", true) == 1)
                        {
                            try
                            {
                                myCmd.CommandText = "sp_helpindex \"" + myTable.Name + "\"";
                                //myCmd.CommandType = System.Data.CommandType.Text ;
                                myReader = myCmd.ExecuteReader();
                                while (myReader.Read())
                                {
                                    string strKeyName = myReader.GetString(0);
                                    string strDesc    = myReader.GetString(1);
                                    string strFields  = myReader.GetString(2);
                                    bool   bolPrimary = (strDesc.ToLower().IndexOf("primary") >= 0);
                                    foreach (string strField in strFields.Split(','))
                                    {
                                        FieldInfo myField = myTable.Fields[strField.Trim()];
                                        if (myField != null)
                                        {
                                            myField.Indexed    = true;
                                            myField.PrimaryKey = bolPrimary;
                                        }
                                    } //foreach
                                }     //while
                                myReader.Close();
                            }
                            catch (Exception ext)
                            {
                                //this.List.Remove( myTable );
                                myTable.Name = myTable.Name + " " + ext.Message;
                            }
                        }
                    } //foreach
                }     //using
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                if (myConn.State == ConnectionState.Open)
                {
                    myConn.Close();
                }
                myConn.Dispose();
            }

            return(RecordCount);
        }//public int LoadFromSQLServer( System.Data.IDbConnection myConn )
        /// <summary>
        /// 从 Jet40( Access2000 ) 的数据库中加载数据结构信息
        /// </summary>
        /// <param name="myConn">数据库连接对象</param>
        /// <returns>加载的字段信息个数</returns>
        public int LoadFromAccess(OleDbConnection myConn)
        {
            intFillStyle = FillStyleConst.Access2000;
            int RecordCount = 0;

            myTables.Clear();
            string dbName = myConn.DataSource;

            if (dbName != null)
            {
                strName = System.IO.Path.GetFileName(dbName);
            }

            try
            {
                if (myConn.State != ConnectionState.Open)
                {
                    myConn.Open();
                }

                using (System.Data.DataTable myDataTable =
                           myConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Columns, null))
                {
                    foreach (System.Data.DataRow myRow in myDataTable.Rows)
                    {
                        string strTable = Convert.ToString(myRow["TABLE_NAME"]);
                        if (!strTable.StartsWith("MSys"))
                        {
                            TableInfo myTable = myTables[strTable];
                            if (myTable == null)
                            {
                                myTable      = new TableInfo();
                                myTable.Name = strTable;
                                myTables.Add(myTable);
                            }
                            FieldInfo myField = new FieldInfo();
                            myTable.Fields.Add(myField);
                            myField.Name     = Convert.ToString(myRow["COLUMN_NAME"]);
                            myField.Nullable = Convert.ToBoolean(myRow["IS_NULLABLE"]);
                            System.Data.OleDb.OleDbType intType = (System.Data.OleDb.OleDbType)
                                                                  Convert.ToInt32(myRow["DATA_TYPE"]);
                            if (System.DBNull.Value.Equals(myRow["DESCRIPTION"]) == false)
                            {
                                myField.Remark = Convert.ToString(myRow["DESCRIPTION"]);
                            }
                            if (intType == System.Data.OleDb.OleDbType.WChar)
                            {
                                myField.FieldType = "Char";
                            }
                            else
                            {
                                myField.FieldType = intType.ToString();
                            }
                            myField.FieldWidth = Convert.ToString(myRow["CHARACTER_MAXIMUM_LENGTH"]);
                            RecordCount++;
                        }
                    } //foreach
                }     //using
                using (System.Data.DataTable myDataTable =
                           myConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Indexes, null))
                {
                    foreach (System.Data.DataRow myRow in myDataTable.Rows)
                    {
                        string    strTable = Convert.ToString(myRow["TABLE_NAME"]);
                        TableInfo myTable  = myTables[strTable];
                        if (myTable != null)
                        {
                            FieldInfo myField = myTable.Fields[Convert.ToString(myRow["COLUMN_NAME"])];
                            if (myField != null)
                            {
                                myField.Indexed    = true;
                                myField.PrimaryKey = (Convert.ToBoolean(myRow["PRIMARY_KEY"]));
                            }
                        }
                    } //foreach
                }     //using
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                if (myConn.State == ConnectionState.Open)
                {
                    myConn.Close();
                }
                myConn.Dispose();
            }
            return(RecordCount);
        }//public int LoadFromAccess2000( OleDbConnection myConn )
        }//public int LoadFromOracle( System.Data.IDbConnection myConn )

        /// <summary>
        /// 从 Oracle 加载数据库结构信息
        /// </summary>
        /// <param name="myConn">数据库连接对象</param>
        /// <returns>加载的字段信息个数</returns>
        public int GetOracleDb(IDbConnection myConn)
        {
            intFillStyle = FillStyleConst.Oracle;
            int    RecordCount = 0;
            string strSQL      = null;

            strSQL = "Select TName,CName,coltype,width  From Col Order by TName,CName";
            myTables.Clear();
            if (myConn is Devart.Data.Oracle.OracleConnection)
            {
                strName = ((Devart.Data.Oracle.OracleConnection)myConn).DataSource
                          + "" + myConn.Database;
            }
            else
            {
                strName = myConn.Database;
            }

            try
            {
                using (System.Data.IDbCommand myCmd = myConn.CreateCommand())
                {
                    if (myConn.State != ConnectionState.Open)
                    {
                        myConn.Open();
                    }
                    myCmd.CommandText = strSQL;
                    IDataReader myReader  = myCmd.ExecuteReader(CommandBehavior.SingleResult);
                    TableInfo   LastTable = null;
                    while (myReader.Read())
                    {
                        string TableName = myReader.GetString(0).Trim();
                        if (LastTable == null || LastTable.Name != TableName)
                        {
                            LastTable = new TableInfo();
                            myTables.Add(LastTable);
                            LastTable.Name = TableName;
                        }
                        FieldInfo NewField = new FieldInfo();
                        LastTable.Fields.Add(NewField);
                        NewField.Name       = myReader.GetString(1);
                        NewField.FieldType  = myReader.GetString(2);
                        NewField.FieldWidth = myReader[3].ToString();
                        RecordCount++;
                    }//while
                    myReader.Close();

                    myCmd.CommandText = @"
select table_name , 
	column_name , 
	index_name 
from user_ind_columns 
order by table_name , column_name ";
                    myReader          = myCmd.ExecuteReader(CommandBehavior.SingleResult);
                    TableInfo myTable = null;
                    while (myReader.Read())
                    {
                        myTable = myTables[myReader.GetString(0)];
                        if (myTable != null)
                        {
                            string    IDName    = myReader.GetString(2);
                            string    FieldName = myReader.GetString(1);
                            FieldInfo myField   = myTable.Fields[FieldName];
                            if (myField != null)
                            {
                                myField.Indexed = true;
                                if (IDName.StartsWith("PK"))
                                {
                                    myField.PrimaryKey = true;
                                }
                            }
                        }
                    } //while
                    myReader.Close();
                }     //using
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                if (myConn.State == ConnectionState.Open)
                {
                    myConn.Close();
                }
                myConn.Dispose();
            }
            return(RecordCount);
        }//public int LoadFromOracle( System.Data.IDbConnection myConn )
        /// <summary>
        /// 从PDM数据结构定义XML文件中加载数据结构信息
        /// </summary>
        /// <param name="doc">XML文档对象</param>
        /// <returns>加载的字段信息个数</returns>
        public int LoadFromPDMXMLDocument(XmlDocument doc)
        {
            intFillStyle = FillStyleConst.PDM;
            int RecordCount = 0;

            myTables.Clear();
            XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable);

            nsm.AddNamespace("a", "attribute");
            nsm.AddNamespace("c", "collection");
            nsm.AddNamespace("o", "object");
            XmlNode RootNode = doc.SelectSingleNode("/Model/o:RootObject/c:Children/o:Model", nsm);

            if (RootNode == null)
            {
                return(0);
            }
            strName        = ReadXMLValue(RootNode, "a:Name", nsm);
            strDescription = strName;
            // 数据表
            foreach (XmlNode TableNode in RootNode.SelectNodes("c:Tables/o:Table", nsm))
            {
                TableInfo table = new TableInfo();
                myTables.Add(table);
                table.Name   = ReadXMLValue(TableNode, "a:Code", nsm);
                table.Remark = ReadXMLValue(TableNode, "a:Name", nsm);
                string keyid = ReadXMLValue(TableNode, "c:PrimaryKey/o:Key/@Ref", nsm);
                System.Collections.Specialized.StringCollection Keys =
                    new System.Collections.Specialized.StringCollection();
                if (keyid != null)
                {
                    foreach (XmlNode KeyNode in TableNode.SelectNodes(
                                 "c:Keys/o:Key[@Id = '" + keyid + "']/c:Key.Columns/o:Column/@Ref", nsm))
                    {
                        Keys.Add(KeyNode.Value);
                    }
                }
                foreach (XmlNode FieldNode in TableNode.SelectNodes("c:Columns/o:Column", nsm))
                {
                    RecordCount++;
                    string    id    = ((XmlElement)FieldNode).GetAttribute("Id");
                    FieldInfo field = new FieldInfo();
                    table.Fields.Add(field);
                    field.Name        = ReadXMLValue(FieldNode, "a:Code", nsm);
                    field.Remark      = ReadXMLValue(FieldNode, "a:Name", nsm);
                    field.Description = ReadXMLValue(FieldNode, "a:Comment", nsm);
                    string FieldType = ReadXMLValue(FieldNode, "a:DataType", nsm);
                    if (FieldType != null)
                    {
                        int index = FieldType.IndexOf("(");
                        if (index > 0)
                        {
                            FieldType = FieldType.Substring(0, index);
                        }
                    }
                    field.FieldType = FieldType;

                    field.FieldWidth = ReadXMLValue(FieldNode, "a:Length", nsm);
                    if (Keys.Contains(id))
                    {
                        field.PrimaryKey = true;
                    }
                }
            }
            return(RecordCount);
        }