树形数据导入

系统切换,

有树形数据要从旧系统中导入到新系统中。

树形数据字段大概有Id,ParentId,FullId。

建了一个同步中间表OldId,NewId,State,Remark

刚开始准备循环所有旧数据,遍历旧数据的FullId,

判断中间表OldId是否已存在,不存在再判断是否第一级,第一级就直接添加,

不是第一级就再取NewId的ParentId的FullId加上自己的Id生成自己的FullId。

感觉这样很麻烦,而且要多次读存数据库。

向同事小K请教了一下,小K提供了一个思路,

在程序中先把所有记录的NewId生成,保存在内存中一个中间表。

View Code
 1 DataTable dtAllId = new DataTable();
 2             dtAllId.Columns.Add("LZNode_Id", typeof(string));
 3             dtAllId.Columns.Add("NewId", typeof(string));
 4             //遍历一次 先把要导入的guid生成对应表存在内存中
 5             foreach (DataRow dr in dtAllKJNode.Rows)
 6             {
 7                 DataRow drNew = dtAllId.NewRow();
 8                 drNew["LZNode_Id"] = dr["Node_Id"];
 9                 drNew["NewId"] = Guid.NewGuid();
10                 dtAllId.Rows.Add(drNew);
11             }

 

这样向数据插记录时就不用再生成NewId,而是从内存中间表去查询。

生成FullId也不用向数据库去查询。

View Code
 1 foreach (DataRow dr in dtLevelTwo.Rows)
 2             {
 3                 #region 数据转换
 4                 Model.Catalog_KJ modelCatalog_KJ = new global::LZDataExport.Model.Catalog_KJ();
 5                 modelCatalog_KJ.Id = CommandFunction.ObjectToStr(dtAllId.Select("LZNode_Id='" + CommandFunction.ObjectToStr(dr["Node_Id"]) + "'")[0]["NewId"]);
 6                 //节点名称
 7                 modelCatalog_KJ.Name = CommandFunction.ObjectToStr(dr["Node_Name"]);
 8                 //节点编码
 9                 modelCatalog_KJ.Code = CommandFunction.ObjectToStr(dr["Node_Code"]);
10                 //ParentId
11                 string ParentId = CommandFunction.ObjectToStr(dr["Node_ParentId"]);
12                 if (ParentId != "VR0001")
13                 {
14                     modelCatalog_KJ.ParentId = CommandFunction.ObjectToStr(dtAllId.Select("LZNode_Id='" + ParentId + "'")[0]["NewId"]);
15                 }
16                 //IsPublished
17                 modelCatalog_KJ.IsPublished = true;
18                 //FullId
19                 string FullId = "";
20                 string Node_AllParentId = CommandFunction.ObjectToStr(dr["Node_AllParentId"]);
21                 string[] Node_AllParentIds = Node_AllParentId.Split(',');
22                 //从上自下循环 Node_Id 第一个VR0001不循环 生成这边的FullId 以[.]分开 
23                 for (int i = 1; i < Node_AllParentIds.Length; i++)
24                 {
25                     string Node_Id = Node_AllParentIds[i];
26                     FullId += CommandFunction.ObjectToStr(dtAllId.Select("LZNode_Id='" + Node_Id + "'")[0]["NewId"]) + ".";
27                 }
28                 FullId = FullId.TrimEnd('.');
29                 modelCatalog_KJ.FullId = FullId;
30                 //NodeTypeId
31                 modelCatalog_KJ.NodeTypeId = NodeTypeId;//CommandFunction.KJ_LevelTwo;//"7d45704e-31fe-4787-a440-b798a56b032a";
32                 #endregion
33                 string IsSuccess = DALCatalog_KJ.Add(modelCatalog_KJ, CommandFunction.ObjectToStr(dr["Node_Id"]), Node_AllParentId);
34                 LogTxt.AppendText("导入科技"+CatalogName+",理正记录ID[" + CommandFunction.ObjectToStr(dr["Node_Id"]) + "],平台记录ID[" + modelCatalog_KJ.Id + "]," + IsSuccess + "\r");
35             }

 

posted on 2012-07-24 16:59  thegavincheng  阅读(348)  评论(0编辑  收藏  举报