【问题标题】:Query on two DataTable to find duplicate rows查询两个 DataTable 以查找重复行
【发布时间】:2012-10-25 16:10:29
【问题描述】:

我有一个 Excel 表,我正在使用 sqlbulkcopy 将其上传到 sqlserver 表,我在数据库表上应用了一个索引,以便忽略重复条目,但我也想显示在网格视图中被忽略的重复条目。

  protected void Button1_Click(object sender, EventArgs e)
{
    string strFileType = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();
    string strFileName = FileUpload1.PostedFile.FileName.ToString();

    FileUpload1.SaveAs(Server.MapPath("~/Import/" + strFileName + strFileType));
    string strNewPath = Server.MapPath("~/Import/" + strFileName + strFileType);






        string excelConnectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source="+strNewPath +"; Extended Properties=Excel 8.0;");

    //string excelConnectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=C:\\myFolder\\Book1.xls;" + "Extended Properties=Excel 8.0;"); 


        // Create Connection to Excel Workbook
        using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
        {
            connection.Open();
            OleDbCommand command = new OleDbCommand("Select ID,Data FROM [Sheet1$]", connection);
            OleDbCommand command1 = new OleDbCommand("select count(*) from [Sheet1$]",connection);

            //Sql Server Table DataTable
            DataTable dt4=new DataTable();
            SqlCommand cmd4 = new SqlCommand("select id,data from ExcelTable", con);
            try 
                { 
                    SqlDataAdapter da4 = new SqlDataAdapter(cmd4); 
                    da4.Fill(dt4);//sql table datatable
                 }
                catch { }


            //excelsheet datatable
            DataTable oltlb = new DataTable();
          OleDbCommand olcmd = new OleDbCommand("select id,data from [Sheet1$]", connection);
          try
          {
              OleDbDataAdapter olda = new OleDbDataAdapter(olcmd);
              olda.Fill(oltlb); //excel table datatable
          }
          catch { }

    var matched = (from table1 in dt4.AsEnumerable()
                         join table2 in oltlb.AsEnumerable() on
                       table1.Field<int>("ID") equals table2.Field<int>("ID")
                         where table1.Field<string>("Data") == table2.Field<string>("Data")
                         select table1);
          DataTable dthi5 = new DataTable();
          dthi5 = matched.CopyToDataTable();

          GridView1.DataSource = dthi5;
          GridView1.DataBind();
            GridView1.DataSource = matched.ToList();

错误: 指定的演员表无效。 table1.Field("ID") 等于 table2.Field("ID")

【问题讨论】:

    标签: c# asp.net sql-server linq


    【解决方案1】:

    您的一个表中的 ID 字段似乎不是 int。

    与其一个或两个猜测,不如尝试检查两个表(oltlb 和 dt4)中第一列的数据类型,看看哪个具有非整数数据类型。实际上可能两者兼而有之。

    事情是这样的:即使字符串的值是数字文字,您也不能将字符串转换为 int。您必须使用 Int32.ParseConvert.ToInt32 进行转换。因此,如果您的一个表的 ID 列具有字符串类型,您可以这样表示:

    table1.Field<int>("ID") equals Convert.ToInt32(table2.Field<string>("ID"))
    

    如果两个表都有一个字符串 ID 字段,你可以这样表达:

    table1.Field<string>("ID") equals table2.Field<string>("ID")
    

    【讨论】:

    • 两张表的第一列是什么数据类型?
    • 第一个表是 sql 表 int,第二个表是我从 excel 表导出的表
    • 在“var 匹配”行放置一个断点。在调试中运行您的代码。当它到达断点时,在“立即”窗口中,键入? oltlb.Columns[0].DataType 并按 Enter。它说什么?
    • 我在 Convert.ToInt32(table2.Field("ID")) 中遇到错误,无法将“System.Double”类型的对象转换为“System.String”类型。跨度>
    • 好的,这很容易解决。将其更改为Convert.ToInt32(table2.Field&lt;Double&gt;("ID"))
    猜你喜欢
    • 2012-10-15
    • 2011-09-28
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多