0

基本的に次のことを行う C# コードを作成しようとしています。

  • コードは MySql テーブルに接続し、1 つの MySql テーブル (r 行と c 列) からデータを読み取ります。ここでは問題はありません。

  • 次にコードは、MySqlDataReader を使用して 1 つの DataTable を定義してロードします。この段階でも問題はありません。コードは問題ありません。

  • このデータテーブルの各列は、実際には戦略の 1 つの戦略パラメータです (つまり、このデータテーブルの各行はone parameter set of the strategy.

そうは言っても:

  • コードは、このデータテーブルのすべての行をループします。

  • コードは各行の列の値を 1 つずつ取得し、XML 要素を 1 つずつ変更して、古い戦略の値を新しい値に置き換えます。これがエラーの原因です!!! WEALTHLAB C# エディター内から XML ファイルを変更できません!!

  • そうすれば、ストラテジーは毎回新しいパラメーター セットで構成されます。

  • 次に、コードは runDonor を呼び出し、指定された (新しい) パラメーター セットを使用して戦略を実行します - runDonor の呼び出しも問題ありません!;

  • 最後に、特定の統計が記録され、1 つの MySql テーブルに挿入されます。ここでも問題はありません。

**

このコードの大部分が welllab 名前空間に関連していないことを考慮して、最初にほとんどの部分を Visual Studio でコーディングし、そこで Visual Studio コンパイラを使用してコンパイルしたところ、コードが正常に機能することがわかりました。(つまり、Xelement の編集は問題なく行われました。このコードを Visual Studio で実行すると、ループごとに XML ファイルが変更されていることがわかりました!)

次に、このコードをコピーして、wealthscript エディターに貼り付けましたが、残念ながら、コードはコンパイルされませんでした!!.

**

問題は、ElementAt メソッドを使用して XML ドキュメントの変更を開始する領域にあります。

より具体的には、ElementAt ステートメントは Visual Studio エディターでは正常に機能しますが、Wealthlab エディターでは機能しません。

繰り返しますが、同じ DLL を参照USING...し、コードの上に同じステートメントを使用しているにもかかわらず、Visual Studio はエラーを返さず、完全に実行されますが、Wealthlab は次のエラーを返します。

'System.Collections.Generic.IEnumerable' <System.Xml.Linq> does not contain a definition for 'ElementAt' 
and no extension method 'ElementAt' accepting a first argument of type
'System.Collections.Generic.IEnumerable' <System.Xml.Linq> could be found (are you
missing a using directive or an assembly reference?)"

私は何年もの間グーグルで検索してきましたが、まだまともな解決策を思いつくことができませんでした.

また、私にはプログラミングの経験がないので、同じ参照と同じ using ディレクティブを使用する同じコードが Visual Studio では機能するのに、Wealthlab ではエラーが発生する理由が本当にわかりません。

このリンクでは、1 つの解決策の選択肢が誓われていますが、率直に言って、それは私にとって英語ではありません

**

したがって、私の質問は 2 つあります。

1- System.Xml.Linq への適切な参照に関連するこの興味深いエラーをどのように克服できますか? 明らかに、ここに問題があります。

2- または、これを捨ててゼロから始めましょう: XML をどのように変更しますか? xml ファイルから読み取る、またはそれらを変更して保存するサンプル コードのリンクが提供された場合、それは素晴らしいことです。

(助けてください...)

皆さんが同じエラーを繰り返すように、コード全体もここに添付します。これをエディターにコピーして、コードが正常に実行されるかどうかを確認します。

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using Community.Components;
using System.Collections;
using System.Xml;
using System.Xml.XPath;
using System.Linq;
using System.IO;
using System.Data;
using System.Xml.Linq; // THIS IS WHERE THE PROBLEM IS THIS REFERENCE COULD NOT BE SET PROPERLY!! WHY?!! 
using MySql.Data.MySqlClient;

namespace WealthLab.Strategies
{
    public class MyStrategy : WealthScript
    {
        // public DateTime now;
        public static XElement SourceXml;
        public static XElement DonorStrategyXml;
        public static string SourceXmlName;
        public static string Ticker;

        public static int nNames;

        public string DonorStrategyXmlFolder;
        public string DonorStrategyXmlName;
        public string DonorStrategyXmlNameWithNoXml;
        public string DonorStrategyXmlPathName;

        protected override void Execute()
        {
            //....

            //....

            //....

            DonorStrategyXmlFolder = @"C:\Users\Aykut\AppData\Roaming\Fidelity Investments\WealthLabDev\1.0.0.0\Data\Strategies\Customized\";  
            DonorStrategyXmlName = "sss.xml";
            DonorStrategyXmlNameWithNoXml = "sss";

            string DonorStrategyXmlPathName = DonorStrategyXmlFolder + DonorStrategyXmlName;
            DonorStrategyXml = XElement.Load(DonorStrategyXmlPathName);



            foreach (DataRow dbBandParameterRow in dbBandParameters.Rows) {
                foreach (DataRow dbNNParameterRow in dbNNParameters.Rows) {
                    string ResultID = dbBandParameterRow["ResultID"].ToString();


                    int nE = 0;
                     //....

                    //....

                    //.THIS IS WHERE THE PROBLEM LIES AT!!...

DonorStrategyXml.Elements("ParameterValues").Descendants("double").ElementAt(nE).Value = dbBandParameterRow["RatioForUpper"].ToString();
                    nE++;
DonorStrategyXml.Elements("ParameterValues").Descendants("double").ElementAt(nE).Value = dbBandParameterRow["ADXPeriodForUpper"].ToString();

                    // output certain statistics of the strategy onto mysql // later!!!
                    //....

                    //....

                    PrintDebug("NetProfit:" + sp.Results.NetProfit.ToString());
                }
            }

        }

    } // class
} // nspace
4

1 に答える 1