3

私は最近、非常に単純な ETL プロセスにRhino-Etlを使い始めたばかりで、大きな成功を収めています。私はもう少し複雑なシナリオに対処する必要がありますが、ConventionInputCommandOperation が期待どおりに動作することがわかりませんでした。

私がやろうとしていることの非常に単純化された例を完成させました。基本的に 2 つのシステムが関係しており、最初にシステム 1 を照会するまで、システム 2 から何を取得したいのかわかりません。別の InputOperation の直後に InputOperation を登録すると、ループのように動作すると考えました。そのため、操作 1 の各行が操作 2 に渡されます。以下のコードは、「操作 DetailReader の実行に失敗しました: スカラー変数 @PlanetAbbrv を宣言する必要があります。」で失敗します。だから私の質問は、入力操作が以前の入力操作に依存している状況をどのように処理するつもりですか?

ありがとう、ブライアン

using System;
using Rhino.Etl.Core;
using Rhino.Etl.Core.ConventionOperations;

namespace ETLTest
{
    class Program
    {
        static void Main()
        {
            new MainProcess().Execute();
            Console.ReadLine();
        }
    }

    public class MainProcess : EtlProcess
    {
        protected override void Initialize()
        {
            Register(new MainReader());
            Register(new DetailReader());
        }

        protected override void PostProcessing()
        {
            foreach (var exception in GetAllErrors())
            {
                throw exception;
            }
        }
    }

    public class MainReader : ConventionInputCommandOperation
    {
        public MainReader() : base("Galactic1")
        {
            Command = @"select * from Planet";
        }
    }

    public class DetailReader : ConventionInputCommandOperation
    {
        public DetailReader() : base("Galactic2")
        {
            Command = @"select * from Delivery where DeliveryPlanetAbbrv = @PlanetAbbrv";
        }
    }
}
4

1 に答える 1

0

DetailReader ですべての行を選択する必要があります (where 操作を削除します)。次に、JoinOperation を使用して、詳細を主要な情報に一致させます。

Register(new JoinPlanets()
                     .Right(new MainReader())
                     .Left(new DetailReader()));


public class JoinPlanets: JoinOperation
{
    protected override Row MergeRows(Row leftRow, Row rightRow)
    {
        Row row = leftRow.Clone();
        foreach (var column in leftRow.Columns)
            row[column] = leftRow[column];
        return row;
    }

    protected override void SetupJoinConditions()
    {
        FullOuterJoin.Left("PlanetAbbrv")
                     .Right("DeliveryPlanetAbbrv");
    }
}
于 2014-01-03T15:46:21.620 に答える