Beispiel #1
0
        /// <summary>读取</summary>
        /// <param name="table"></param>
        /// <param name="reader"></param>
        /// <returns></returns>
        public static IDataTable ReadXml(this IDataTable table, XmlReader reader)
        {
            // 读属性
            if (reader.HasAttributes)
            {
                reader.MoveToFirstAttribute();
                ReadXml(reader, table);
            }

            reader.ReadStartElement();

            // 读字段
            reader.MoveToElement();
            // 有些数据表模型没有字段
            if (reader.NodeType == XmlNodeType.Element && reader.Name.EqualIgnoreCase("Table"))
            {
                return(table);
            }

            while (reader.NodeType != XmlNodeType.EndElement)
            //while (reader.NodeType == XmlNodeType.Element)
            {
                switch (reader.Name)
                {
                case "Columns":
                    reader.ReadStartElement();
                    while (reader.IsStartElement())
                    {
                        var dc = table.CreateColumn();
                        var v  = reader.GetAttribute("DataType");
                        if (v != null)
                        {
                            dc.DataType = v.GetTypeEx(false);
                            v           = reader.GetAttribute("Length");
                            if (v != null && Int32.TryParse(v, out var len))
                            {
                                dc.Length = len;
                            }

                            dc = FixDefaultByType(dc, null);
                            // 清空默认的原始类型,让其从xml读取
                            dc.RawType = null;
                        }
                        (dc as IXmlSerializable).ReadXml(reader);
                        table.Columns.Add(dc);
                    }
                    reader.ReadEndElement();

                    // 修正可能的主字段
                    if (!table.Columns.Any(e => e.Master))
                    {
                        var f = table.Columns.FirstOrDefault(e => e.Name.EqualIgnoreCase("Name", "Title"));
                        if (f != null)
                        {
                            f.Master = true;
                        }
                    }
                    break;

                case "Indexes":
                    reader.ReadStartElement();
                    while (reader.IsStartElement())
                    {
                        var di = table.CreateIndex();
                        (di as IXmlSerializable).ReadXml(reader);
                        di.Fix();
                        table.Indexes.Add(di);
                    }
                    reader.ReadEndElement();
                    break;

                case "Relations":
                    reader.ReadStartElement();
                    reader.Skip();
                    reader.ReadEndElement();
                    break;

                default:
                    // 这里必须处理,否则加载特殊Xml文件时将会导致死循环
                    reader.Read();
                    break;
                }
            }

            if (reader.NodeType == XmlNodeType.EndElement)
            {
                reader.ReadEndElement();
            }

            // 修正
            table.Fix();

            return(table);
        }
Beispiel #2
0
        /// <summary>根据数据行取得数据表</summary>
        /// <param name="rows">数据行</param>
        /// <returns></returns>
        protected List <IDataTable> GetTables(DataRow[] rows)
        {
            if (_columns == null)
            {
                try { _columns = GetSchema(_.Columns, null); }
                catch (Exception ex) { DAL.WriteDebugLog(ex.ToString()); }
            }
            if (_indexes == null)
            {
                try { _indexes = GetSchema(_.Indexes, null); }
                catch (Exception ex) { DAL.WriteDebugLog(ex.ToString()); }
            }
            if (_indexColumns == null)
            {
                try { _indexColumns = GetSchema(_.IndexColumns, null); }
                catch (Exception ex) { DAL.WriteDebugLog(ex.ToString()); }
            }

            try
            {
                var list = new List <IDataTable>();
                foreach (DataRow dr in rows)
                {
                    #region 基本属性
                    IDataTable table = DAL.CreateTable();
                    table.TableName = GetDataRowValue <String>(dr, _.TalbeName);

                    // 顺序、编号
                    Int32 id = 0;
                    if (TryGetDataRowValue <Int32>(dr, "TABLE_ID", out id))
                    {
                        table.ID = id;
                    }
                    else
                    {
                        table.ID = list.Count + 1;
                    }

                    // 描述
                    table.Description = GetDataRowValue <String>(dr, "DESCRIPTION");

                    // 拥有者
                    table.Owner = GetDataRowValue <String>(dr, "OWNER");

                    // 是否视图
                    table.IsView = "View".EqualIgnoreCase(GetDataRowValue <String>(dr, "TABLE_TYPE"));

                    table.DbType = Database.DbType;
                    #endregion

                    #region 字段及修正
                    // 字段的获取可能有异常,但不应该影响整体架构的获取
                    try
                    {
                        var columns = GetFields(table);
                        if (columns != null && columns.Count > 0)
                        {
                            table.Columns.AddRange(columns);
                        }

                        var indexes = GetIndexes(table);
                        if (indexes != null && indexes.Count > 0)
                        {
                            table.Indexes.AddRange(indexes);
                        }

                        // 先修正一次关系数据
                        table.Fix();
                    }
                    catch (Exception ex)
                    {
                        if (DAL.Debug)
                        {
                            DAL.WriteLog(ex.ToString());
                        }
                    }

                    FixTable(table, dr);

                    list.Add(table);
                    #endregion
                }

                #region 表间关系处理
                //// 某字段名,为另一个表的(表名+单主键名)形式时,作为关联字段处理
                //foreach (var table in list)
                //{
                //    foreach (var rtable in list)
                //    {
                //        if (table != rtable) table.Connect(rtable);
                //    }
                //}
                ModelHelper.Connect(list);

                //// 因为可能修改了表间关系,再修正一次
                //foreach (var table in list)
                //{
                //    table.Fix();
                //}
                #endregion

                return(list);
                // 不要把这些清空。因为,多线程同时操作的时候,前面的线程有可能把后面线程的数据给清空了
            }
            finally
            {
                _columns      = null;
                _indexes      = null;
                _indexColumns = null;
            }
        }