private static string GetConstant(BcpTable bcpTable, List <BcpNode> lstBcpNodes, BcpColumn col, string key) { switch (key) { case "AppName": //获取应用信息,如"QQ" return(bcpTable.AppName); } return(key); }
/// <summary> /// 转换函数的参数 /// </summary> /// <param name="bcpTable"></param> /// <param name="lstBcpNodes"></param> /// <param name="xmldoc"></param> /// <param name="tn"></param> /// <param name="col"></param> /// <param name="tmpTable"></param> /// <param name="dr"></param> /// <param name="paramJson"></param> /// <returns></returns> private static object[] GetConverterParams(BcpTable bcpTable, List <BcpNode> lstBcpNodes, XmlDocument xmldoc, XmlNode tn, BcpColumn col, DataTable tmpTable, DataRow dr, string paramJson) { BcpConverterParam[] param = BcpConverterParam.ToConverterParams(paramJson); if (param.IsValid()) { object[] result = new object[param.Length]; int index = 0; foreach (BcpConverterParam p in param) { object pk = null; if (p.FK == BcpForeignKey.None && tmpTable.Columns.Contains(p.FKProperty)) //当前表中的列 { pk = dr[p.FKProperty]; } else { XmlNode fn = ToXmlNode(tn, p.FKNode); //外键关联节点 if (fn != null) { var fkNode = lstBcpNodes.FirstOrDefault(bn => bn.XmlNode == fn); if (fkNode != null) { if (p.FK == BcpForeignKey.Merge) { pk = fkNode.DataTable != null ? fkNode.DataTable.Rows[0][p.FKProperty].ToSafeString() : null; } else if (p.FK == BcpForeignKey.NodeText) //该列的数据为TreeNode节点显示的文本 { pk = fkNode.TreeNode.Text; } else if (p.FK == BcpForeignKey.Constant) //该列的数据为常量数据 { pk = GetConstant(bcpTable, lstBcpNodes, col, p.FKProperty); } else if (p.FK == BcpForeignKey.Row) //该行的属性 { if (p.FKProperty == "rowid") { pk = (dr.Table.Rows.IndexOf(dr) + 1).ToString("D32"); } else { if (tmpTable.Columns.Contains(p.FKProperty)) { pk = dr[p.FKProperty]; } } } } } } result[index++] = pk; } return(result); } else { return(null); } }
/// <summary> /// 生成BCP对应的Datatable /// </summary> /// <param name="bcpTable"></param> /// <param name="lstBcpNodes"></param> /// <param name="xmldoc"></param> /// <returns></returns> private DataTable BulidBcpTable(BcpTable bcpTable, List <BcpNode> lstBcpNodes, XmlDocument xmldoc) { DataTable dt = null; var tnodes = ToXmlNodeList(xmldoc, bcpTable.Node); //获取该bcp表对应的节点 if (tnodes == null) { return(dt); } foreach (XmlNode tn in tnodes) { var sourceNode = lstBcpNodes.FirstOrDefault(bn => bn.XmlNode == tn); if (sourceNode != null && sourceNode.DataTable != null) { DataTable tmpTable = sourceNode.DataTable.Copy(); //基本数据表 foreach (var col in bcpTable.Columns) //遍历所有配置的列 { if (col.FK == BcpForeignKey.None && tmpTable.Columns.Contains(col.Property)) //如果该列在当前表中,则只需要修改列名 { int samePropertyCol = bcpTable.Columns.Count( c => c.FK == BcpForeignKey.None && tmpTable.Columns.Contains(c.Property)); if (samePropertyCol <= 1) //如果未出现相同的列,只需要修改列名 { tmpTable.Columns[col.Property].ColumnName = col.GAWACode; } else //有多个列,则需要复制列数据 { tmpTable.Columns.Add(col.GAWACode); foreach (DataRow dr in tmpTable.Rows) { dr[col.GAWACode] = dr[col.Property]; } } } else //如果该列是外键关联数据,需要找到对应的关联节点获取 { if (!col.FKNode.IsValid()) //未设置外键节点则表示为当前节点 { col.FKNode = "."; } tmpTable.Columns.Add(col.GAWACode); XmlNode fn = ToXmlNode(tn, col.FKNode); //外键关联节点 if (fn != null) { var fkNode = lstBcpNodes.FirstOrDefault(bn => bn.XmlNode == fn); if (fkNode != null) { if (col.FK == BcpForeignKey.Merge) //如果没有定义当前表的关联属性,表示直接从关联节点中获取数据并添加 { if (fkNode.DataTable.Columns.Contains(col.FKProperty)) { string pk = fkNode.DataTable != null ? fkNode.DataTable.Rows[0][col.FKProperty].ToSafeString() : null; if (pk.IsValid()) { foreach (DataRow dr in tmpTable.Rows) { dr[col.GAWACode] = pk; } } } } else if (col.FK == BcpForeignKey.NodeText) //该列的数据为TreeNode节点显示的文本 { string pk = fkNode.TreeNode.Text; if (pk.IsValid()) { foreach (DataRow dr in tmpTable.Rows) { dr[col.GAWACode] = pk; } } } else if (col.FK == BcpForeignKey.Constant) //该列的数据为常量数据 { string pk = GetConstant(bcpTable, lstBcpNodes, col, col.Property); if (pk.IsValid()) { foreach (DataRow dr in tmpTable.Rows) { dr[col.GAWACode] = pk; } } } else if (col.FK == BcpForeignKey.Row) //该列的数据为行参数 { int rowid = 0; foreach (DataRow dr in tmpTable.Rows) { if (col.Property == "rowid") //rowid表示当前行号,从1开始 { dr[col.GAWACode] = (++rowid).ToString("D32"); } else if (tmpTable.Columns.Contains(col.FKProperty)) //其它列的数据复制 { dr[col.GAWACode] = dr[col.FKProperty]; } } } } } } #region 数据转换 if (col.ConverterFunction.IsValid()) { foreach (DataRow dr in tmpTable.Rows) { object[] param = GetConverterParams(bcpTable, lstBcpNodes, xmldoc, tn, col, tmpTable, dr, col.ConverterParam); dr[col.GAWACode] = ConverterResult(col.ConverterFunction, param, dr[col.GAWACode]); } } #endregion } if (dt == null) { dt = tmpTable; } else { dt.Merge(tmpTable); //合并表格,比如qq有多个账户时,每次都合并1个账户的好友数据,结果就为全部账户的好友列表数据 } } } #region 对表进行后续处理,比如添加ID列,删除其他列等 if (dt != null) { //对表数据进行筛选 if (bcpTable.RowFilter.IsValid()) { DataRow[] drss = dt.Select(bcpTable.RowFilter); if (!drss.IsValid()) { return(null); } DataTable tmp = drss[0].Table.Clone(); drss.ForEach(row => { tmp.ImportRow(row); }); dt = tmp; } dt.TableName = bcpTable.GAWACode; //设置表名 for (int i = dt.Columns.Count - 1; i >= 0; i--) //移除其它非BCP列 { if (!bcpTable.Columns.Any(col => col.GAWACode == dt.Columns[i].ColumnName) && "I050008" != dt.Columns[i].ColumnName) { dt.Columns.RemoveAt(i); } } foreach (DataRow dr in dt.Rows) //添加并设置“手机取证采集目标编号” { dr["I050008"] = _acquisitionTargetNumber; } } #endregion return(dt); }