2016-03-25 10 views
0

LINQを使用してC#で2つのデータテーブルを比較する際に問題が発生しています。このアプリケーションの目的は、3つの異なるOracleデータベースからデータを取り出し、そのデータをMySQLデータベースに転送することです。アプリケーションの中で私は両方のテーブルを引っ張り、それらを比較してMySQLテーブルにないラインを見つけて追加します。私から奪っていたデータが重複を含めることができるため2つのデータテーブルを比較するとSystem.InvalidCastExceptionが発生する

MySQLデータベースからテーブルは、3つの主要キーを利用しています。同じデータが3つのOracleデータベースのそれぞれに送信されますが、異なる環境サーバーにあります。私は(生産、ステージングなど...)私は3つのデータテーブルに環境列を追加することによって、行が重複しないようにすることができますが、比較して欠落している行を見つけて、新しいデータテーブル私は常に無効なキャスト例外を取得します。

私はその後、私はテーブルのクローンを作成し、クローン化されたテーブルのデータ型を設定し、Oracleデータベースから最初のテーブルをつかんいます。

o1Clone.Columns["CASEID"].DataType = typeof(Int64); 
    o1Clone.Columns["CASENAME"].DataType = typeof(string); 
    o1Clone.Columns["CREATEDDATE"].DataType = typeof(DateTime); 
    o1Clone.Columns["STUDYMODEID"].DataType = typeof(int); 
    o1Clone.Columns["ENVIRONMENT"].DataType = typeof(string); 

DataTypesを追加した後、3つの異なるデータ型をすべてインポートし、それらをMySQLデータベースと比較します。ここで

var matched = from table1 in oClone.AsEnumerable() 
          join table2 in mClone.AsEnumerable() on table1.Field<Int64>("CASEID") equals table2.Field<Int64>("CASEID") 
          where table1.Field<string>("CASENAME") == table2.Field<string>("CASENAME") || table1.Field<DateTime>("CREATEDDATE") == table2.Field<DateTime>("CREATEDDATE") || table1.Field<int>("STUDYMODEID") == table2.Field<int>("STUDYMODEID") || table1.Field<string>("ENVIRONMENT") == table2.Field<string>("ENVIRONMENT") 
          select table1; 
      var missing = from table1 in oClone.AsEnumerable() 
          where !matched.Contains(table1) 
          select table1; 
      DataTable mm = missing.CopyToDataTable(); 

は、エラーの絵です: Error

私はこれですべてのヘルプははるかに高く評価されるだろうわからデータ型が一致し作っていますので、私はエラーを取得していますなぜ私は表示されません。また、誰かがLINQを使うのではなく、これを行うより良い方法を持っている場合は、投稿してください。

+0

これらのデータベースフィールドのいずれかはNULL可能ですか?その場合は、.Netの種類が一致する必要があります。それらの – Seano666

+0

Seano666 @どれもここに私の要素のうち – SWard

+0

NULL可能ではないが、これらのいずれかが投げていることが表示されます: 'table1.Field (「CASEID」)'。私はそこから、例えば、[おそらく関連するSOの投稿](http://stackoverflow.com/questions/35227563/oracle-dataaccess-datarow-fielddecimal-invalidcastexception)のようなグーグルが開始することを確認します。また、基礎となるデータ型がInt64と互換性がない場合は、 'o1Clone.Columns [" CASEID "]をベットします。DataType = typeof(Int64)'はあなたが望むことをしていません。 Int64と完全に互換性がなく、Int64に変換できない場合でも、「これはInt64データ型です」と言っています。 – Quantic

答えて

0

試行錯誤の多くの後、私は働く解決策を見つけることができました。

var matched = from table1 in oClone.AsEnumerable() 
       join table2 in mClone.AsEnumerable() on table1.Field<decimal>("CASEID") equals table2.Field<Int64>("CASEID") 
       where table1.Field<decimal>("CASEID") == table2.Field<Int64>("CASEID") || 
       table1.Field<string>("CASENAME") == table2.Field<string>("CASENAME") || 
       table1.Field<DateTime>("CREATEDDATE") == table2.Field<DateTime>("CREATEDDATE") || 
       table1.Field<int>("STUDYMODEID") == table2.Field<int>("STUDYMODEID") || 
       table1.Field<string>("ENVIRONMENT") == table2.Field<string>("ENVIRONMENT") 
       select table1; 
var missing = from table1 in oClone.AsEnumerable() 
       where !matched.Contains(table1) 
       select table1; 
関連する問題