2016-05-14 56 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

相關問題