void InitServerByDatabase() { using (var dataReader = DataHelper.Instance.ExecuteProcedureReader("InitServer")) { if (dataReader == null) { return; // Stopwatch sw = Stopwatch.StartNew(); } dataReader.Read(); int count = dataReader.GetInt32(0); _list = new List <TagMetaData>(count);//把所有激活的 数据库记录 都导入 _list<TagMetaData> 里面 _mapping = new Dictionary <string, ITag>(count); dataReader.NextResult(); while (dataReader.Read()) { var meta = new TagMetaData(dataReader.GetInt16(0), dataReader.GetInt16(1), dataReader.GetString(2), dataReader.GetString(3), dataReader.GetString(10), (DataType)dataReader.GetByte(4), (ushort)dataReader.GetInt16(5), dataReader.GetBoolean(6), dataReader.GetFloat(7), dataReader.GetFloat(8), dataReader.GetInt32(9)); _list.Add(meta); if (meta.Archive) { //Id 和Cycle 其实就是归档的时间,归档周期没有设定(0),则置为 null _archiveTimes.Add(meta.ID, meta.Cycle == 0 ? null : new ArchiveTime(meta.Cycle, DateTime.MinValue));//归档的ID,归档的时间 } } _list.Sort();//只是id 排序就好了 dataReader.NextResult(); while (dataReader.Read()) { if (_driver != null) { IGroup grp = _driver.AddGroup(dataReader.GetString(1), dataReader.GetInt16(2), dataReader.GetInt32(3), dataReader.GetFloat(4), dataReader.GetBoolean(5)); if (grp != null) { grp.AddItems(_list);//这里完成 从 _list<TagMetaData> 到 _list<ITag>的转换 ,这个地方是需要根据 GroupID 的不同,生成不同的组别,对应于不同的页面?? } } } } //待归档的列表里面 有 超过一个的 变量,就开启归档 if (_archiveTimes.Count > 0) { _hasHda = true; _hda.Capacity = MAXHDACAP;//单次归档的最大数据 1 万条; } }