/// <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); }
/// <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; } }