2011-01-19 7 views
2

私は2つのDataTableを持っています。インターネット上のXMLファイルから、ratesというDataTableに検索されたデータがあります。DataTablesに参加するには?

DataTable rates = DB.GetCurrentFxPrices("http://rates.fxcm.com/RatesXML"); 
DataTable openTrades = DB.GetOpenTrades(); 

私はrateと呼ばopenTradesに列を追加し、そこから現在のレートを置きたい:私はまた、このようなコードでopenTradesと呼ばれるデータベースから取得されたfinanical取引のセットでDataTableを持っていますratesDataTableは、symbolという列に参加しています。次の列がありDataTable

料金:

tradeId, symbolと、新たに追加されたrateコラム:

Bid, Ask, High, Low, Direction, Last, Symbol

openTrades DataTableは、以下の関連列があります。私はこのデータを一緒に結合する最も効率的な方法を探していて、新しいrate列にopenTrades DataTableの結果があります。

EDIT

私はこのコードをしようとしている:

DBUtil DB = new DBUtil(); 
DataTable rates = DB.GetCurrentFxPrices("http://rates.fxcm.com/RatesXML"); 
DataTable openTrades = DB.GetOpenTrades(); 

openTrades.Columns.Add("Bid", typeof(decimal)); 
openTrades.Columns.Add("Ask", typeof(decimal)); 

var query = from DataRow tradeRow in openTrades.Rows 
      join DataRow rateRow in rates.Rows 
      on tradeRow.Field<string>("symbol") equals rateRow.Field<string>("Symbol") 
      select new 
      { 
       TradeRow = tradeRow, 
       //Bid = rateRow.Field<decimal>("Bid"), 
       //Ask = rateRow.Field<decimal>("Ask") 
       Rate = (rateRow.Field<decimal>("Bid") + rateRow.Field<decimal>("Ask"))/2 
      }; 

foreach (var item in query) 
{ 
    //item.TradeRow["Bid"] = item.Bid; 
    //item.TradeRow["Ask"] = item.Ask; 
    item.TradeRow["lastPrice"] = item.Rate; 
} 

をしかし、私はselectに、このエラーを取得する:

System.InvalidCastException: Specified cast is not valid.

答えて

1

次のクエリで既存のテーブルを結合し、その結果のシーケンスを反復処理して、取引テーブルのRate値を更新することができます。

var query = from DataRow tradeRow in openTrades.Rows 
      join DataRow rateRow in rates.Rows 
      on tradeRow.Field<string>("Symbol") equals rateRow.Field<string>("Symbol") 
      select new 
      { 
       TradeRow = tradeRow, 
       Rate = rateRow.Field<decimal>("Rate") // use actual type 
      }; 

foreach (var item in query) 
{ 
    item.TradeRow["Rate"] = item.Rate; 
} 

openTradesテーブルに変更内容が反映されている必要があります。

+0

返信いただきありがとうございます。私はあなたのコードを 'Rate =' rate =(rateRow.Field ( "Bid")+ rateRow.Field ( "Ask"))/ 2 'に変更して、 (金利価格はありません)。あなたのforeach内のitem.TradeRowをitem.TradeRow ["lastPrice"] = item.Rate;に変更しましたが、 'select'行にこのエラーが出ます:' System.InvalidCastException {"指定されたキャストは無効です"}'私は使用している完全なコードで質問を編集しました。 –

+1

@ Markでは、レートテーブルの列は小数点以下の桁数ではなく、倍数形式または別の形式になる可能性があります。最初に ''を試してみるか、データの種類をテストしてください。 –

+0

それはそれでした!このコードはそれを修正しました: 'Rate =(decimal.Parse(rateRow.Field (" Bid "))+ decimal.Parse(rateRow.Field ))/ 2'ご協力いただきありがとうございます。 –

1

あなたがLINQのを使用してに見たことがこれを行う?

次のようなものが必要です。結果として生じる匿名型は、必要に応じてDataTableにロードすることも、グリッドコントロールで直接バインドすることもできます。 System.Linqの System.Xml.Linq

幸運を:

using (var wc = new System.Net.WebClient()) { 
var openTrades = new [] { 
    new {tradeId="000", symbol="EURUSD"}, 
    new {tradeId="001", symbol="USDJPY"} 
}; 

var resultData = XElement.Parse(wc.DownloadString("http://rates.fxcm.com/RatesXML")) 
    .Elements("Rate") 
    .Select(x=>new { 
     Symbol=x.Attribute("Symbol").Value, 
     Bid=x.Element("Bid").Value, 
     Ask=x.Element("Ask").Value, 
     High=x.Element("High").Value, 
     Low=x.Element("Low").Value, 
     Direction=x.Element("Direction").Value, 
     Last=x.Element("Last").Value 
    }) 
    .ToList() 
    .Join(openTrades, x=>x.Symbol, x=>x.symbol, (rate,trades)=> new {trades.tradeId, rate.Symbol, rate.Ask, rate.Bid, rate.High, rate.Low, rate.Direction, rate.Last}) 
    .ToList();   

}

は、この作業を行うには、次の名前空間を参照する必要があるでしょう!

関連する問題