2016-05-14 54 views
0

我一直被困在这一整天....我的爱人可以解决它!从相同数据集中的2个表格之间的关系创建表或数据集

所以,有2个表

在包含在仓库等

和Excel表在数量
条形码,说明列,(ds.Tables [ “访问”])

访问表( ds.Tables [“创先争优”]),其中包含
条码列,quantiy责令等无论名称如何F2,F4,F8

那么,如何得到最终的数据表/数据集(什么我可以.DataSource对DataGridView)与Excel和Access相匹配的条形码? ??

  OleDbConnection conAccess = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\PROGRAMMING.LAB\\geekx_recent.mdb"); 
     OleDbDataAdapter daAccess = new OleDbDataAdapter("Select Barcode AS BARCODE, quantity AS QTY_WH From Stock", conAccess); 

     DataSet dsAll = new DataSet(); 
     daAccess.Fill(dsAll, "Access"); 

     OleDbConnection conExcel = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\PROGRAMMING.LAB\\order.xlsx;Extended Properties = Excel 12.0 Xml"); 
     OleDbDataAdapter daExcel = new OleDbDataAdapter("SELECT F2 AS BARCODE, F8 AS ORDER_CUST FROM [phil$] WHERE ISNUMERIC(F8)",conExcel); 
     daExcel.Fill(dsAll, "Excel"); 

     DataRelation dr = dsAll.Relations.Add("Excel_Access", dsAll.Tables["Excel"].Columns["BARCODE"], dsAll.Tables["Access"].Columns["BARCODE"], false); 
     DataTable dtExcel = dsAll.Tables["Excel"]; 
     DataTable dtAccess = dsAll.Tables["Access"]; 
     DataTable dtAll = new DataTable(); 

     var query = from ex in dtExcel.AsEnumerable() 
        join ac in dtAccess.AsEnumerable() 
        on ex.Field<string>("BARCODE") equals ac.Field<string>("BARCODE") 
        select new 
        { 

         Order = ex.Field<string>("ORDER_CUST"), 
         Stock = ac.Field<string>("QTY_WH"), 
         Barcode = ex.Field<string>("BARCODE") 
        }; 

        foreach (var q in query) 
        { 
      dtAll.Rows.Add(q.Barcode, q.Stock, q.Order); 

        } 

     dataGridView1.DataSource = dtAll; 

这返回
“”类型的未处理的异常发生在System.Data.DataSetExtensions.dll 其他信息:无法转换类型“System.Double”为类型“系统的对象。串'。 在选择新区块

任何想法的人?

+0

使用LINQ JOIN在两个DataTable。我建议将这两个数据表放入一个datagridview.DataSource = ds.Talbe [0](也是1),以便您可以看到列的标题名称。联接使用标题名称来组合这两个表。 – jdweng

+0

嘿jdwng所以我尝试使用连接没有运气,它要么疯狂对我使用/不使用枚举或对我大喊关于不使用正确的演员?有什么想法吗? – KAPA

回答

0

请参见下面的代码和以下网页加盟表:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

  DataTable dt1 = new DataTable(); 
      DataTable dt2 = new DataTable(); 


      var results = 
       from c1 in dt1.AsEnumerable() 
       join c2 in dt2.AsEnumerable() 
        on c1.Field<int>("ID") equals c2.Field<int>("ID") into cs 
       select new { Category = c1.Field<string>("ColB"), Fields = cs }; 
+0

嘿JD,非常感谢,但我用你的代码片段并改变了表名,但intellisense不会显示CopyToDataTable,或者如果我尝试datagridview.datasource = results;没有显示?我究竟做错了什么? – KAPA

+0

也JD在你的方法,我似乎无法选择新的任何东西的C2范围,它是无法识别的? – KAPA

+0

对于c2,请参阅我提供的链接。要查看c2,您需要使用for或Seclect()方法枚举cs。只有DataTable结构存在时,CopyToDataTable才起作用。由于您已经加入了这两个表格,因此生成了一个新表格,因此您没有结构。我通常在你的情况下创建一个新的DataTable并在代码中添加列到表中。然后把linq结果放到新表中。你也可以在网上搜索“c#datatable anonymous linq”解决方案。 – jdweng

相关问题