我在 SQL Server 中有一个从 Web 服务填充的表。我希望它按计划刷新。我想要一些类似于 SQL 合并操作的东西。
那就是我定义了我的源(Web 服务)和我的目标(SQL 表),并且我定义了如何处理从源中丢失的目标和匹配项。
让我们考虑一个场景,我在表Description和Deleted中只有两个字段,并且 Web 服务仅提供Description。
如果表和 Web 服务中都存在描述,那么我只是更新(或不更新)。
如果 Web 服务中存在描述,但表中没有,我希望将其插入
如果 Web 服务器中不再存在描述,我希望将其标记为 Deleted = true
我目前拥有的是:
public class WebServiceResults: AbstractOperation
{
public WebServiceResults()
{
var WebService = new WebService();
WSResults = WebService.GetResults();
}
IEnumerable<WSResult> WSResults { get; set; }
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
foreach(var obj in WSResults)
yield return Row.FromObject(obj);
}
}
class SQLTableResults : AbstractOperation
{
public SQLTableResults()
{
SQLResults = data.MyTable.Select(x=>new {x.Description,x.Deletet});
}
Data data = new Data();
IEnumerable<SQLResult> SQLResults { get; set; }
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
foreach (var obj in SQLResults)
yield return Row.FromObject(obj);
}
}
public override void Dispose()
{
data.Dispose();
base.Dispose();
}
}
class JoinTables : JoinOperation
{
protected override Row MergeRows(Row leftRow, Row rightRow)
{
Row row = leftRow.Clone();
row["Description2"] = rightRow["Description"];
return row;
}
protected override void SetupJoinConditions()
{
FullOuterJoin
.Left("Description")
.Right("Description");
}
}
class MergeTables : AbstractOperation
{
Data data = new Data();
public MergeTables()
{ }
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
foreach (var obj in rows)
{
if (String.IsNullOrEmpty((string)obj["Description2"]))
{
//Code for not matched at target
yield return Row.FromObject(obj);
}
if (String.IsNullOrEmpty((string)obj["Description"]))
{
//Code for not matched at source
yield return Row.FromObject(obj);
}
{
//Code for matched
yield return Row.FromObject(obj);
}
}
}
public override void Dispose()
{
data.Dispose();
base.Dispose();
}
}
protected override void Initialize()
{
Register(
new JoinTables()
.Left(new SQLTableResults())
.Right(new WebServiceResults())
);
Register(new MergeTables());
foreach (var error in GetAllErrors())
Console.Write(error.Message);
}
这是要走的路吗?我会想象更多的逐步过程,比如
Register(new NotMatchedAtSourceOperation());
Register(new NotMatchedAtTargetOperation());
Register(new MatchedOperation());
但据我了解,每个寄存器将其行返回到下一个,所以如果我过滤不匹配的,那么其他两个将什么也不做。
我应该为每个案例创建一个新流程吗?
顺便说一句,我正在寻找有关 RhinoEtl 的文档。你知道任何链接吗?有教程吗?