2016-05-14 4 views
0

私はこの一日中立ち往生しています....それを解決できる人に私の愛!!!!同じデータセット内の2つのテーブル間の関係からテーブルまたはデータセットを作成

だから、(に
バーコード、説明、倉庫などの数量

とExcel表の列を含み(ds.Tables [ "アクセス"])で2つのテーブル

アクセス表がありますds.Tables [「エクセル」])
バーコードの列が含まれ、quantiyはなどを命じたがF2、F4、F8

という名前は、どのように私は(最終のDataTable/DataSetを得るか、私が上に.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.InvalidCastExceptionの」の
未処理の例外がSystem.Data.DataSetExtensions.dll で発生しました追加情報を返します:型のオブジェクトをキャストすることができません「System.Double」「システムを入力します。文字列 '。 新しいブロックを選択してください

アイデアは誰ですか?

+0

使用LINQのは、二つのDataTableに登録しよう。 2つのデータセットをdatagridview.DataSource = ds.Talbe [0](また1)に入れて、列のヘッダー名を確認することをお勧めします。結合はヘッダー名を使用して2つのテーブルを結合します。 – jdweng

+0

こんにちはjdwngので、私は幸運との結合を使用して試してみましたか、使用して/使用しないについてenumerablesを使用していないか、私に正しいキャストを使用しないについて叫んでいますか?何かご意見は? – 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

Hey JD、ありがとうございますが、私はあなたのスニペットを使用してテーブル名を変更しましたが、IntellisenseはCopyToDataTableを表示しません。あるいは、datagridview.datasource = results;何も表示されません?私は間違って何をしていますか? – KAPA

+0

あなたのメソッドでもJD、私はc2範囲のために新しいものを選択することができない、それは認識されないのですか? – KAPA

+0

c2の場合はリンクを参照してください。 c2を見るには、forかSeclect()メソッドを使ってcsを列挙する必要があります。 CopyToDataTableは、DataTable構造体が存在する場合にのみ機能します。 2つのテーブルを結合したので、新しいテーブルが生成され、構造を持たないようにします。私は通常あなたのケースでは、新しいDataTableを作成し、列にコードを追加します。次に、linqの結果を新しいテーブルに入れます。また、Webで "c#datatable anonymous linq"のソリューションを検索することもできます。 – jdweng

関連する問題