/// <summary>/// 账面数据 Accounting/// </summary>/// <returns></returns>DataTable setDataAccounting(){DataTable dt = new DataTable();dt.Columns.Add("id", typeof(int));dt.Columns.Add("empno", typeof(string));dt.Columns.Add("empname", typeof(string));dt.Columns.Add("sex", typeof(bool));dt.Columns.Add("wage", typeof(decimal));dt.Columns.Add("birthday", typeof(DateTime));dt.Rows.Add(1, "L0001", "涂聚文",false,4500,"1970-03-04");dt.Rows.Add(2, "L0002", "刘杰", false, 4300, "1972-04-04");dt.Rows.Add(3, "L0003", "宋承宪", false, 4500, "1974-04-04");dt.Rows.Add(4, "L0005", "宁夏", false, 4500, "1973-04-04");dt.Rows.Add(6, "L0009", "江东", true, 5500, "1975-04-04");dt.Rows.Add(6, "L0010", "李燕云", true, 9500, "1976-04-04");dt.Rows.Add(7, "L0020", "赵雅芝", false, 14500, "1977-04-04");return dt;}/// <summary>/// 盘点数据 Inventory/// </summary>/// <returns></returns>DataTable setDataInventory(){DataTable dt = new DataTable();dt.Columns.Add("id", typeof(int));dt.Columns.Add("empno", typeof(string));dt.Columns.Add("empname", typeof(string));dt.Columns.Add("sex", typeof(bool));dt.Columns.Add("wage", typeof(decimal));dt.Columns.Add("birthday", typeof(DateTime));dt.Rows.Add(10, "L0001", "涂聚文", false, 4500, "1970-03-04");dt.Rows.Add(11, "L0002", "刘杰", false, 4300, "1972-04-04");dt.Rows.Add(12, "L0009", "江东", true, 5500, "1973-04-04");dt.Rows.Add(13, "L0010", "李燕云", true, 9500, "1974-04-04");dt.Rows.Add(14, "L0020", "赵雅芝", false, 14500, "1975-04-04");dt.Rows.Add(15, "L0032", "徐若萱", false, 4300, "1976-04-04");dt.Rows.Add(16, "L0056", "保芝林", true, 4200, "1977-04-04");dt.Rows.Add(17, "L0042", "何燕华", false, 4100, "1978-04-04");dt.Rows.Add(18, "L0052", "黄花菜", false, 4400, "1979-04-04");dt.Rows.Add(19, "L0012", "艾薇儿", true, 5500, "1982-04-04");dt.Rows.Add(20, "L0018", "傅艺伟", false, 6500, "1932-04-04");dt.Rows.Add(21, "L0028", "李世民", false, 9500, "1992-04-04");return dt;}/// <summary>/// /// </summary>public Form1(){InitializeComponent();}/// <summary>/// /// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){this.dataGridViewAccounting.DataSource = setDataAccounting();this.dataGridViewInventory.DataSource = setDataInventory();}/// <summary>/// 比结果/// /// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){try{DataTable datadiff1 = new DataTable();DataTable datadiff2 = new DataTable();DataTable dataOverage = new DataTable();//盘盈DataTable dataInventoryLoss = new DataTable();//盘亏DataTable datatable1 = setDataAccounting();DataTable datatable2 = setDataInventory();#region //var qry1 = datatable1.AsEnumerable().Select(a => new { MobileNo = a["empno"].ToString() });//var qry2 = datatable2.AsEnumerable().Select(b => new { MobileNo = b["empno"].ToString() });//var exceptAB = qry1.Except(qry2);//DataTable dtMisMatch = (from a in datatable1.AsEnumerable()//                        join ab in exceptAB on a["empno"].ToString() equals ab.MobileNo//                        select a).CopyToDataTable();detect row deletes - a row is in datatable1 except missing from datatable2//var exceptAB1 = qry1.Except(qry2);// dataInventoryLoss= (from a in datatable1.AsEnumerable()//               join ab in exceptAB1 on a["empno"].ToString() equals ab.MobileNo//               select a).CopyToDataTable();detect row inserts - a row is in datatable2 except missing from datatable1//var exceptAB2 = qry2.Except(qry1);// dataOverage = (from a in datatable2.AsEnumerable()//                     join ab in exceptAB2 on a["empno"].ToString() equals ab.MobileNo//                     select a).CopyToDataTable();#endregion //CompareDataTable(setDataAccounting(), setDataInventory(), "empno","id", out dataOverage, out datadiff1, out datadiff2, out dataInventoryLoss);CompareLinQDataTable(setDataAccounting(), setDataInventory(), "empno", out dataOverage, out dataInventoryLoss);this.dataGridViewOverage.DataSource =dataOverage;this.dataGridViewInventoryLoss.DataSource = dataInventoryLoss;this.dataGridViewAdd.DataSource =datadiff1 ;this.dataGridViewDel.DataSource = datadiff2;}catch (Exception ex){ex.Message.ToString();}}/// <summary>/// 比较两个DataTableCompare数据(结构相同)/// 涂聚文/// http://www.codeproject.com/Tips/344792/Compare-two-datatable-using-LINQ-Query/// </summary>/// <param name="datatable1"></param>/// <param name="datatable2"></param>/// <param name="keyField"></param>/// <param name="dataOverage"></param>/// <param name="dataInventoryLoss"></param>public static void CompareLinQDataTable(DataTable datatable1, DataTable datatable2, string keyField,out DataTable dataOverage,out DataTable dataInventoryLoss){var qry1 = datatable1.AsEnumerable().Select(a => new { IdNo = a[keyField].ToString() });var qry2 = datatable2.AsEnumerable().Select(b => new { IdNo = b[keyField].ToString() });//detect row deletes - a row is in datatable1 except missing from datatable2var exceptAB1 = qry1.Except(qry2);dataInventoryLoss = (from a in datatable1.AsEnumerable()join ab in exceptAB1 on a[keyField].ToString() equals ab.IdNoselect a).CopyToDataTable();//detect row inserts - a row is in datatable2 except missing from datatable1var exceptAB2 = qry2.Except(qry1);dataOverage = (from a in datatable2.AsEnumerable()join ab in exceptAB2 on a[keyField].ToString() equals ab.IdNoselect a).CopyToDataTable();}/// <summary>/// 比较两个DataTableCompare数据(结构相同)/// 来源于:http://www.cnblogs.com/houlinbo/archive/2010/02/10/1667189.html/// </summary>/// <param name="dt1">来自数据库的DataTable</param>/// <param name="dt2">来自文件的DataTable</param>/// <param name="keyField">要比较的关键字段名</param>/// <param name="keyid">不需要比较的字段名id</param>/// <param name="dtRetAdd">新增数据(dt2中的数据)</param>/// <param name="dtRetDif1">不同的数据(数据库中的数据)</param>/// <param name="dtRetDif2">不同的数据(dt2中的数据,修改过的)</param>/// <param name="dtRetDel">删除的数据(dt2中的数据)</param>public static void CompareDataTable(DataTable dt1, DataTable dt2, string keyField,string keyid, out DataTable dtRetAdd, out DataTable dtRetDif1, out DataTable dtRetDif2,out DataTable dtRetDel){//为三个表拷贝表结构dtRetDel = dt1.Clone();dtRetAdd = dtRetDel.Clone();dtRetDif1 = dtRetDel.Clone();dtRetDif2 = dtRetDel.Clone();int colCount = dt1.Columns.Count;DataView dv1 = dt1.DefaultView;DataView dv2 = dt2.DefaultView;//先以第一个表为参照,看第二个表是修改了还是删除了foreach (DataRowView dr1 in dv1){dv2.RowFilter = keyField + " = '" + dr1[keyField].ToString() + "'";if (dv2.Count > 0){if (!CompareUpdate(dr1, dv2[0]))//比较是否有不同的{dtRetDif1.Rows.Add(dr1.Row.ItemArray);//修改前dtRetDif2.Rows.Add(dv2[0].Row.ItemArray);//修改后dtRetDif2.Rows[dtRetDif2.Rows.Count - 1][keyid] = dr1.Row[keyid];//将ID赋给来自文件的表,因为它的ID全部==0continue;}}else{//已经被删除的dtRetDel.Rows.Add(dr1.Row.ItemArray);}}//以第一个表为参照,看记录是否是新增的dv2.RowFilter = "";//清空条件foreach (DataRowView dr2 in dv2){dv1.RowFilter = keyField + " = '" + dr2[keyField].ToString() + "'";if (dv1.Count == 0){//新增的dtRetAdd.Rows.Add(dr2.Row.ItemArray);}}}/// <summary>/// /// </summary>/// <param name="dr1"></param>/// <param name="dr2"></param>/// <returns></returns>private static bool CompareUpdate(DataRowView dr1, DataRowView dr2){//行里只要有一项不一样,整个行就不一样,无需比较其它object val1;object val2;for (int i = 1; i < dr1.Row.ItemArray.Length; i++){val1 = dr1[i];val2 = dr2[i];if (!val1.Equals(val2)){return false;}}return true;}

  

/// <summary>///datatable relational operators///20150825///Geovin Du///http://weblogs.sqlteam.com/davidm/archive/2004/01/21/753.aspx/// </summary>public class SQLOps{/// <summary>/// /// </summary>public SQLOps(){//// TODO: Add constructor logic here//}/// <summary>/// /// </summary>/// <param name="First"></param>/// <param name="Second"></param>/// <param name="FJC"></param>/// <param name="SJC"></param>/// <returns></returns>public static DataTable Join(DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC){//Create Empty TableDataTable table = new DataTable("Join");// Use a DataSet to leverage DataRelationusing (DataSet ds = new DataSet()){//Add Copy of Tablesds.Tables.AddRange(new DataTable[] { First.Copy(), Second.Copy() });//Identify Joining Columns from FirstDataColumn[] parentcolumns = new DataColumn[FJC.Length];for (int intLoop = 0; intLoop < parentcolumns.Length; intLoop++){parentcolumns[intLoop] = ds.Tables[0].Columns[FJC[intLoop].ColumnName];}//Identify Joining Columns from SecondDataColumn[] childcolumns = new DataColumn[SJC.Length];for (int intLoop = 0; intLoop < childcolumns.Length; intLoop++){childcolumns[intLoop] = ds.Tables[1].Columns[SJC[intLoop].ColumnName];}//Create DataRelationDataRelation r = new DataRelation(string.Empty, parentcolumns, childcolumns, false);ds.Relations.Add(r);//Create Columns for JOIN tablefor (int intLoop = 0; intLoop < First.Columns.Count; intLoop++){table.Columns.Add(First.Columns[intLoop].ColumnName, First.Columns[intLoop].DataType);}for (int intLoop = 0; intLoop < Second.Columns.Count; intLoop++){//Beware Duplicatesif (!table.Columns.Contains(Second.Columns[intLoop].ColumnName))table.Columns.Add(Second.Columns[intLoop].ColumnName, Second.Columns[intLoop].DataType);elsetable.Columns.Add(Second.Columns[intLoop].ColumnName + "_Second", Second.Columns[intLoop].DataType);}//Loop through First tabletable.BeginLoadData();foreach (DataRow firstrow in ds.Tables[0].Rows){//Get "joined" rowsDataRow[] childrows = firstrow.GetChildRows(r);if (childrows != null && childrows.Length > 0){object[] parentarray = firstrow.ItemArray;foreach (DataRow secondrow in childrows){object[] secondarray = secondrow.ItemArray;object[] joinarray = new object[parentarray.Length + secondarray.Length];Array.Copy(parentarray, 0, joinarray, 0, parentarray.Length);Array.Copy(secondarray, 0, joinarray, parentarray.Length, secondarray.Length);table.LoadDataRow(joinarray, true);}}}table.EndLoadData();}return table;}/// <summary>/// /// </summary>/// <param name="First"></param>/// <param name="Second"></param>/// <param name="FJC"></param>/// <param name="SJC"></param>/// <returns></returns>public static DataTable Join(DataTable First, DataTable Second, DataColumn FJC, DataColumn SJC){return Join(First, Second, new DataColumn[] { FJC }, new DataColumn[] { SJC });}/// <summary>/// /// </summary>/// <param name="First"></param>/// <param name="Second"></param>/// <param name="FJC"></param>/// <param name="SJC"></param>/// <returns></returns>public static DataTable Join(DataTable First, DataTable Second, string FJC, string SJC){return Join(First, Second, new DataColumn[] { First.Columns[FJC] }, new DataColumn[] { First.Columns[SJC] });}/// <summary>/// /// </summary>/// <param name="First"></param>/// <param name="Second"></param>/// <returns></returns>public static DataTable Intersect(DataTable First, DataTable Second){//Get reference to Columns in FirstDataColumn[] firstcolumns = new DataColumn[First.Columns.Count];for (int i = 0; i < firstcolumns.Length; i++){firstcolumns[i] = First.Columns[i];}//Get reference to Columns in SecondDataColumn[] secondcolumns = new DataColumn[Second.Columns.Count];for (int i = 0; i < secondcolumns.Length; i++){secondcolumns[i] = Second.Columns[i];}//JOIN ON all columnsDataTable table = SQLOps.Join(First, Second, firstcolumns, secondcolumns);table.TableName = "Intersect";return table;}/// <summary>/// /// </summary>/// <param name="Values"></param>/// <param name="OtherValues"></param>/// <returns></returns>public static bool RowEqual(object[] Values, object[] OtherValues){if (Values == null)return false;for (int i = 0; i < Values.Length; i++){if (!Values[i].Equals(OtherValues[i]))return false;}return true;}/// <summary>/// /// </summary>/// <param name="Table"></param>/// <param name="Columns"></param>/// <returns></returns>public static DataTable Distinct(DataTable Table, DataColumn[] Columns){//Empty tableDataTable table = new DataTable("Distinct");//Sort variablestring sort = string.Empty;//Add Columns & Build Sort expressionfor (int i = 0; i < Columns.Length; i++){table.Columns.Add(Columns[i].ColumnName, Columns[i].DataType);sort += Columns[i].ColumnName + ",";}//Select all rows and sortDataRow[] sortedrows = Table.Select(string.Empty, sort.Substring(0, sort.Length - 1));object[] currentrow = null;object[] previousrow = null;table.BeginLoadData();foreach (DataRow row in sortedrows){//Current rowcurrentrow = new object[Columns.Length];for (int i = 0; i < Columns.Length; i++){currentrow[i] = row[Columns[i].ColumnName];}//Match Current row to previous rowif (!SQLOps.RowEqual(previousrow, currentrow))table.LoadDataRow(currentrow, true);//Previous rowpreviousrow = new object[Columns.Length];for (int i = 0; i < Columns.Length; i++){previousrow[i] = row[Columns[i].ColumnName];}}table.EndLoadData();return table;}/// <summary>/// /// </summary>/// <param name="Table"></param>/// <param name="Column"></param>/// <returns></returns>public static DataTable Distinct(DataTable Table, DataColumn Column){return Distinct(Table, new DataColumn[] { Column });}/// <summary>/// /// </summary>/// <param name="Table"></param>/// <param name="Column"></param>/// <returns></returns>public static DataTable Distinct(DataTable Table, string Column){return Distinct(Table, Table.Columns[Column]);}/// <summary>/// /// </summary>/// <param name="Table"></param>/// <param name="Columns"></param>/// <returns></returns>public static DataTable Distinct(DataTable Table, params string[] Columns){DataColumn[] columns = new DataColumn[Columns.Length];for (int i = 0; i < Columns.Length; i++){columns[i] = Table.Columns[Columns[i]];}return Distinct(Table, columns);}/// <summary>/// /// </summary>/// <param name="Table"></param>/// <returns></returns>public static DataTable Distinct(DataTable Table){DataColumn[] columns = new DataColumn[Table.Columns.Count];for (int i = 0; i < Table.Columns.Count; i++){columns[i] = Table.Columns[i];}return Distinct(Table, columns);}/// <summary>/// /// </summary>/// <param name="First"></param>/// <param name="Second"></param>/// <returns></returns>public static DataTable Union(DataTable First, DataTable Second){//Result tableDataTable table = new DataTable("Union");//Build new columnsDataColumn[] newcolumns = new DataColumn[First.Columns.Count];for (int i = 0; i < First.Columns.Count; i++){newcolumns[i] = new DataColumn(First.Columns[i].ColumnName, First.Columns[i].DataType);}//add new columns to result tabletable.Columns.AddRange(newcolumns);table.BeginLoadData();//Load data from first tableforeach (DataRow row in First.Rows){table.LoadDataRow(row.ItemArray, true);}//Load data from second tableforeach (DataRow row in Second.Rows){table.LoadDataRow(row.ItemArray, true);}table.EndLoadData();return table;}/// <summary>/// 多个 结构相同的DataTable合并/// </summary>/// <returns></returns>public static DataTable GetAllEntrysDataTable(List<DataTable> GetEntrysDataTable){DataTable newDataTable = GetEntrysDataTable[0].Clone();object[] obj = new object[newDataTable.Columns.Count];for (int i = 0; i < GetEntrysDataTable.Count; i++)//entryGroups.GetEntryGroupCount(){for (int j = 0; j < GetEntrysDataTable[i].Rows.Count; j++){GetEntrysDataTable[i].Rows[j].ItemArray.CopyTo(obj, 0);newDataTable.Rows.Add(obj);}}return newDataTable;}/// <summary>/// 结构不同/// </summary>/// <param name="dt1"></param>/// <param name="dt2"></param>/// <param name="DTName"></param>/// <returns></returns>public static DataTable UnitesDataTable(DataTable dt1, DataTable dt2, string DTName){DataTable dt3 = dt1.Clone();for (int i = 0; i < dt2.Columns.Count; i++){dt3.Columns.Add(dt2.Columns[i].ColumnName);}object[] obj = new object[dt3.Columns.Count];for (int i = 0; i < dt1.Rows.Count; i++){dt1.Rows[i].ItemArray.CopyTo(obj, 0);dt3.Rows.Add(obj);}if (dt1.Rows.Count >= dt2.Rows.Count){for (int i = 0; i < dt2.Rows.Count; i++){for (int j = 0; j < dt2.Columns.Count; j++){dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();}}}else{DataRow dr3;for (int i = 0; i < dt2.Rows.Count - dt1.Rows.Count; i++){dr3 = dt3.NewRow();dt3.Rows.Add(dr3);}for (int i = 0; i < dt2.Rows.Count; i++){for (int j = 0; j < dt2.Columns.Count; j++){dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();}}}dt3.TableName = DTName; //设置DT的名字 return dt3;}/// <summary>/// 结构不同/// </summary>/// <param name="dt1"></param>/// <param name="dt2"></param>/// <returns></returns>public static DataTable UnitesDataTable(DataTable dt1, DataTable dt2){DataTable dt3 = dt1.Clone();for (int i = 0; i < dt2.Columns.Count; i++){dt3.Columns.Add(dt2.Columns[i].ColumnName);}object[] obj = new object[dt3.Columns.Count];for (int i = 0; i < dt1.Rows.Count; i++){dt1.Rows[i].ItemArray.CopyTo(obj, 0);dt3.Rows.Add(obj);}if (dt1.Rows.Count >= dt2.Rows.Count){for (int i = 0; i < dt2.Rows.Count; i++){for (int j = 0; j < dt2.Columns.Count; j++){dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();}}}else{DataRow dr3;for (int i = 0; i < dt2.Rows.Count - dt1.Rows.Count; i++){dr3 = dt3.NewRow();dt3.Rows.Add(dr3);}for (int i = 0; i < dt2.Rows.Count; i++){for (int j = 0; j < dt2.Columns.Count; j++){dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();}}}//dt3.TableName = DTName; //设置DT的名字 return dt3;}}

  

csharp:Compare two DataTables to rows in one but not the other相关推荐

  1. DataTables初始化配置选项学习

    这个是我在学习DataTables时参考官方1.10.20的文档写的一些理解,在这里分享给大家,如果理解有误,欢迎大家在评论区留言. 该文档是用yaml文件,所以大家可以用其它支持yaml的编辑器打开 ...

  2. SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

    前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...

  3. sql优化技巧_使用这些查询优化技巧成为SQL向导

    sql优化技巧 成为SQL向导! (Become an SQL Wizard!) It turns out storing data by rows and columns is convenient ...

  4. 如何对两个大型SQL Server数据库中的数据进行快速估计比较,以查看它们是否相等

    Bringing impactful analysis into a data always comes with challenges. In many cases, we rely on auto ...

  5. 学习sql注入:猜测数据库_学习SQL:删除和更新数据SQL最佳实践

    学习sql注入:猜测数据库 Deleting and updating data is very common, but if performed without taking care, which ...

  6. datatables如何把列设置成hidden隐藏域?

    官网:https://datatables.net/reference/option/设置: visible: false如下: <!DOCTYPE html><html>&l ...

  7. csharp通过dll调用opencv函数,图片作为参数

    [blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数          ​一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...

  8. (转载)The shortest, fastest, and easiest way to compare two tables in SQL Server: UNION

    转自:http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx When you have two tables (or result ...

  9. datatables使用指南

    2019独角兽企业重金招聘Python工程师标准>>> 前言 之前做项目也用过datatables渲染数据表,但也是一扫而过,照着例子初始化,满足基础的搜索,翻页和排序的功能就拉倒了 ...

最新文章

  1. MFC静态文本控件设置超链接
  2. 诺丁汉大学高级计算机科学,诺丁汉大学博士生奖学金介绍
  3. CSP认证201609-1 最大波动[C++题解]:遍历
  4. 多分类loss函数本质理解
  5. linux怎么打开q7后缀的文件,ZQ7 文件扩展名: 它是什么以及如何打开它?
  6. RabbitMQ 队列消息持久化
  7. Jzoj5317 Func
  8. [学习笔记] 二分图基础定理的相关证明
  9. 退出出库复核是什么意思_细思极恐!为什么是黄晓明退出而不是李菲儿?因为女方是芒果艺人...
  10. URLConnection学习
  11. CCF202006-3 Markdown渲染器(100分)【文本处理】
  12. js实现登录表单验证
  13. 【元胞自动机】基于元胞自动机实现双车道靠右行驶交通流模型matlab代码
  14. 海德汉伺服驱动器电源维修UVR150D北京
  15. 地震(earthquake)
  16. PLC面向对象编程系列之双通气缸功能块(SMART梯形图)
  17. 双耳节拍 枕头_枕头2.2.1发布
  18. vue+element 下载or批量下载.mp3文件
  19. 计算机 小学数学应用题教学设计,小学数学教案相遇问题应用题
  20. 华为畅享20plus能更鸿蒙不,甘南收购华为畅享20Plus尾插排线数据线耳机

热门文章

  1. 黄东旭:When TiDB Meets Kubernetes
  2. java --微信支付2
  3. 十分钟搞定CSS选择器
  4. .net Asp AdRotator(广告控件)
  5. C#启动一个外部程序(1)-WinExec
  6. 开源组件XStream 修复11个漏洞并公开 PoC
  7. 洛谷3916 图的遍历
  8. 慎用 apt-get autoremove !
  9. PenMount Touch显示鼠标指针驱动安装
  10. 求给定数组中两数和为给定值的数量