C# 比较2个数据表,结果缺少数据

C# 比较2个数据表,结果缺少数据,c#,datatable,compare,C#,Datatable,Compare,我有两个数据表,它们非常相似,但有其他列名。第一个数据表有4列和大约7000条记录。第二个也有4列和大约37000条记录。现在,我想在第三个datagridview中显示第一个Datatable中缺少的记录。我该怎么做?我知道互联网上有很多关于这方面的代码,但都不起作用 using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.

我有两个数据表,它们非常相似,但有其他列名。第一个数据表有4列和大约7000条记录。第二个也有4列和大约37000条记录。现在,我想在第三个datagridview中显示第一个Datatable中缺少的记录。我该怎么做?我知道互联网上有很多关于这方面的代码,但都不起作用

using Microsoft.Win32; 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Linq;
using System.Data.OleDb;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;




namespace Compare
 {
  public partial class Form1 : Form
   {
    public Form1()
    {
        InitializeComponent();
    }


    DataTable ds;
    DataTable dt;

    public void btn_Click(object sender, EventArgs e)
    {
        SqlDataAdapter adapter = new SqlDataAdapter("select a.FALLZAHL, m.CODE, m.ANZ, m.STDAT From test m with (nolock) inner join test2 a with (nolock) on a.id = m.aid where m.STDAT >= '2016-01-01' and m.STALT = '6363' order by a.FALLZAHL", "Server = ada; Database = sd;Trusted_Connection = True");
        ds = new DataTable(" ");
        adapter.Fill(ds);
        dataGridView1.DataSource = ds;



    }

    private void Excelsheet_Click(object sender, EventArgs e)
    {

        openFileDialog1.ShowDialog();




    }

    private void choose_Click(object sender, EventArgs e)
    {
        OpenFileDialog OpenFileDialog = new OpenFileDialog();



    }
    private string Excel03ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'";

    private string Excel07ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR={0}'";







    public void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
    {
        string filePath = openFileDialog1.FileName;

        string extension = Path.GetExtension(filePath);

        string header = radioButton1.Checked ? "YES" : "NO";

        string conStr, sheetName, cells;




        conStr = string.Empty;

        switch (extension)
        {



            case ".xls": //Excel 97-03

                conStr = string.Format(Excel03ConString, filePath, header);

                break;



            case ".xlsx": //Excel 07

                conStr = string.Format(Excel07ConString, filePath, header);

                break;
        }




        using (OleDbConnection con = new OleDbConnection(conStr))
        {

            using (OleDbCommand cmd = new OleDbCommand())
            {

                cmd.Connection = con;
                con.Open();

                System.Data.DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();




                con.Close();







            }

        }

        using (OleDbConnection con = new OleDbConnection(conStr))
        {

            using (OleDbCommand cmd = new OleDbCommand())
            {

                using (OleDbDataAdapter oda = new OleDbDataAdapter())
                {

                    dt = new DataTable();

                    cmd.CommandText = "SELECT * From [" + sheetName + "]";

                    cmd.Connection = con;

                    con.Open();

                    oda.SelectCommand = cmd;

                    oda.Fill(dt);

                    con.Close();


                    dataGridView2.DataSource = dt; 


                }

            }

        }
    }



   private void dataGridView3_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {


    }


    private void Form1_Load(object sender, EventArgs e)
    {
        /* dataGridView3.DataSource = from table1 in ds.AsEnumerable()
                      join table2 in dt.AsEnumerable() on table1.Field<int>("ColumnA") equals table2.Field<int>("ColumnA")
                      where table1.Field<int>("ColumnB") == table2.Field<int>("ColumnB") || table1.Field<string>("ColumnC") == table2.Field<string>("ColumnC") || table1.Field<object>("ColumnD") == table2.Field<object>("ColumnD")
                      select table1;
         dataGridView3.DataSource = from table1 in ds.AsEnumerable()
                      where !dataGridView3.Contains(table1)
                      select table1;
         */
    }

    public void CompareData()
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        var dsRowCount = ds.AsEnumerable().Count();
        var dtRowCount = dt.AsEnumerable().Count();

        if (dsRowCount > dtRowCount)
        {
            //Set main table to be dt as this has the least number of rows.
            dataGridView3.DataSource = NoMatches(dt, ds);
        }
        else
        {
            //Set main table to ds as this has the least number of rows OR tables have the same number of rows.
            dataGridView3.DataSource = NoMatches(ds, dt);
        }





         }

    private IEnumerable<DataRow> NoMatches(DataTable MainTable, DataTable SecondaryTable)
    {
        var matched = from table1 in MainTable.AsEnumerable()
                      join table2 in SecondaryTable.AsEnumerable()
                      on table1.Field<string>("ISH_FALLZAHL") equals table2.Field<string>("FAL")
                      where (table1.Field<string>("ML_CODE").Equals(table2.Field<string>("LST")))
                     || Convert.ToInt32(table1.Field<Int16>("ML_ANZ")) == Convert.ToInt32(table2.Field<double>("ST"))
                      select table1;

        return MainTable.AsEnumerable().Except(matched);
    }







       // dataGridView3.DataSource = CompareTables();


    }

    /*        public bool DatatablesAreSame()
            {



                if (ds.Rows.Count == dt.Rows.Count)

                    return true;

                foreach (DataColumn dc in ds.Columns)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (ds.Rows[i][dc.ColumnName = "ISH_FALLZAHL"] != dt.Rows[i][dc.ColumnName = "FAL"])
                        {


                        }
                    }
                }

                return true;
            }

       */

/*
    private void CompareTables()
    {

        try
        {



            var dt1Records = ds.AsEnumerable().Select(e1 => new { Id = e1["ISH_FALLZAHL"].ToString(), Name = e1["FAL"].ToString() });

            var dt2Records = dt.AsEnumerable().Select(e2 => new { Id = e2["ISH_FALLZAHL"].ToString(), Name = e2["FAL"].ToString() });



            var extraRecords = dt1Records.Except(dt2Records);




            dataGridView3.DataSource = extraRecords;




        }

        catch (Exception ex)

        { }

    }

  */ 





}
使用Microsoft.Win32;
使用制度;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用System.Data.Linq;
使用System.Data.OleDb;
使用System.Data.Sql;
使用System.Data.SqlClient;
使用系统图;
使用System.IO;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows;
使用System.Windows.Forms;
使用System.Windows.Input;
名称空间比较
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
数据表ds;
数据表dt;
公共无效btn_单击(对象发送者,事件参数e)
{
SqlDataAdapter=new SqlDataAdapter(“从测试m中选择a.FALLZAHL,m.CODE,m.ANZ,m.STDAT,并在a.id=m.aid上使用(nolock)内部连接test2 a和(nolock),其中m.STDAT>='2016-01-01'和m.STALT='6363'由a.FALLZAHL排序”,“服务器=ada;数据库=sd;可信连接=True”);
ds=新数据表(“”);
适配器。填充(ds);
dataGridView1.DataSource=ds;
}
私有void Excelsheet_单击(对象发送者,事件参数e)
{
openFileDialog1.ShowDialog();
}
私有void选择\单击(对象发送者,事件参数e)
{
OpenFileDialog OpenFileDialog=新建OpenFileDialog();
}
私有字符串Excel03ConString=“Provider=Microsoft.Jet.OLEDB.4.0;数据源={0};扩展属性='EXCEL8.0;HDR={1}';
私有字符串Excel07ConString=“Provider=Microsoft.ACE.OLEDB.12.0;数据源={0};扩展属性='EXCEL8.0;HDR={0}';
public void openFileDialog1\u FileOk(对象发送方,System.ComponentModel.CancelEventArgs e)
{
字符串filePath=openFileDialog1.FileName;
字符串扩展名=Path.GetExtension(filePath);
字符串标题=radioButton1。选中?“是”:“否”;
字符串结构、图纸名称、单元格;
conStr=string.Empty;
交换机(分机)
{
案例“.xls”://Excel 97-03
conStr=string.Format(Excel03ConString、filePath、header);
打破
案例“.xlsx”://Excel 07
conStr=string.Format(Excel07ConString、文件路径、标题);
打破
}
使用(OLEDB连接con=新OLEDB连接(cont))
{
使用(OleDbCommand cmd=new OleDbCommand())
{
cmd.Connection=con;
con.Open();
System.Data.DataTable dtExcelSchema=con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);
sheetName=dtExcelSchema.Rows[0][“TABLE_NAME”].ToString();
con.Close();
}
}
使用(OLEDB连接con=新OLEDB连接(cont))
{
使用(OleDbCommand cmd=new OleDbCommand())
{
使用(OleDbDataAdapter oda=新的OleDbDataAdapter())
{
dt=新数据表();
cmd.CommandText=“从[”+sheetName+“]”中选择*;
cmd.Connection=con;
con.Open();
oda.SelectCommand=cmd;
oda.Fill(dt);
con.Close();
dataGridView2.DataSource=dt;
}
}
}
}
私有void dataGridView3_CellContentClick(对象发送者,DataGridViewCellEventArgs e)
{
}
私有void Form1\u加载(对象发送方、事件参数e)
{
/*dataGridView3.DataSource=来自ds.AsEnumerable()中的表1
将table2连接到table1.Field(“ColumnA”)上的dt.AsEnumerable()中等于table2.Field(“ColumnA”)
其中table1.Field(“ColumnB”)==table2.Field(“ColumnB”)|| table1.Field(“ColumnC”)==table2.Field(“ColumnC”)| table1.Field(“ColumnD”)==table2.Field(“ColumnD”)
选择表1;
dataGridView3.DataSource=来自ds.AsEnumerable()中的表1
其中!dataGridView3.Contains(表1)
选择表1;
*/
}
公共无效比较数据()
{
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
var dsRowCount=ds.AsEnumerable().Count();
var dtRowCount=dt.AsEnumerable().Count();
如果(dsRowCount>dtRowCount)
{
//将主表设置为dt,因为它的行数最少。
dataGridView3.DataSource=NoMatches(dt,ds);
}
其他的
{
//将主表设置为ds,因为它的行数最少或表的行数相同。
dataGridView3.DataSource=NoMatches(ds,dt);
}
}
私有IEnumerable NoMatches(DataTable MainTable、DataTable SecondaryTable)
{
var matched=来自MainTable.AsEnumerable()中的表1
将表2连接到SecondaryTable.AsEnumerable()中
表1.字段(“ISH_FALLZAHL”)等于表2.字段(“FAL”)
其中(表1.字段(“ML_代码”)等于(表2.字段(“LST”))
||Convert.ToInt32(表1.Field(“ML_ANZ”)==Convert.ToInt32(表2.Field(“ST”))
选择表1;
返回MainTable.AsEnumerable().Exception(已匹配);
}
//dataGridView3.DataSource=CompareTables();
}
/*public bool DataTablesAreName()
{
if(ds.Rows.Count==dt.Rows.Count)
返回true;
foreach(ds.Columns中的数据列dc)
{
for(int)
var matched = from table1 in ds.Tables["Your Table"].AsEnumerable()
              join table2 in dt2.AsEnumerable()
              on table1.Field<string>("ColumnA") equals table2.Field<string>("ColumnC") 
              where (table1.Field<string>("ColumnB").Equals(table2.Field<string>("ColumnA"))) 
              || (table1.Field<int>("ColumnC") == table2.Field<int>("ColumnD")) 
              select table1;
var matched = from table1 in ds.AsEnumerable()
var dsCaseNumbers = ds.AsEnumerable().Select(x => x.Field<string>("ColumnA").ToList();
var dtCaseNumbers = dt.AsEnumerable().Select(x => x.Field<string>("ColumnC").ToList();
var HasMatches = dsCaseNumbers.Any(y => dtCaseNumbers.Contains(y));
var NoMatches = ds.AsEnumerable().Except(matched);
private IEnumerable<DataRow> NoMatches (DataTable MainTable, DataTable SecondaryTable)
{
    var matched = from table1 in MainTable.AsEnumerable()
                  join table2 in SecondaryTable.AsEnumerable()
                  on table1.Field<string>("ColumnA") equals table2.Field<string>("ColumnC") 
                  where (table1.Field<string>("ColumnB").Equals(table2.Field<string>("ColumnA"))) 
                  || (table1.Field<int>("ColumnC") == table2.Field<int>("ColumnD")) 
                  select table1;

    return MainTable.AsEnumerable().Except(matched);
}
//First determine which table should be considered 'Main'. This will be the one with the LEAST number of rows.
var dsRowCount = ds.AsEnumerable().Count();
var dtRowCount = dt.AsEnumerable().Count();

if (dsRowCOunt > dtRowCount)
{
    //Set main table to be dt as this has the least number of rows.
    datagridView.Datasource = NoMatches(dt, ds);
}
else
{
    //Set main table to ds as this has the least number of rows OR tables have the same number of rows.
    datagridView.Datasource = NoMatches(ds, dt);
}
private DataTable NoMatches (DataTable MainTable, DataTable SecondaryTable)
{
    var matched = from table1 in MainTable.AsEnumerable()
                  join table2 in SecondaryTable.AsEnumerable()
                  on table1.Field<string>("ColumnA") equals table2.Field<string>("ColumnC") 
                  where (table1.Field<string>("ColumnB").Equals(table2.Field<string>("ColumnA"))) 
                  || (table1.Field<int>("ColumnC") == table2.Field<int>("ColumnD")) 
                  select table1;

    return MainTable.AsEnumerable().Except(matched).CopyToDataTable();
}