树形数据导入

系统切换,

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

树形数据字段大概有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             }

 

你可能感兴趣的:(数据导入)