1

RhinoETL 上的许多示例代码都谈到了从 csv 文件加载并插入数据库。如何从 SQL Server 数据库执行读取并将其行输出到控制台?您是否有执行简单 dbread 和批量读取的示例代码?

作者的博客显示了一些示例代码,但它似乎不完整,或者我遗漏了一些东西。

我的非工作代码

public class ReadBuildInfos : ConventionInputCommandOperation
{
    public ReadBuildInfos(ConnectionStringSettings csSettings) : base(csSettings)
    {
        Command = "SELECT Key, Value FROM dbo.BuildInfos WITH (NOLOCK);";
    }

    public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
    {
        foreach (Row row in rows)
        {
            yield return row;
        }
    }
}
4

1 回答 1

1

直接用 Rhino.Etl 调试后,发现我犯了两个错误:

  1. ConnectionStringSettings包括. providerNameRhinoETL 对此抛出了异常,但不知何故我无法看到它

        var csString = new ConnectionStringSettings("myConnection2",
            "Server=yourdatabasehere.database.windows.net;Database=MyDbName;User ID=youruser;Password=yourpassword",
            "System.Data.SqlClient"); //I was missing this.
        Register(new ReadBuildInfosConvention(csString));
    
  2. 作者的博客是完整的。Execute方法不应该被覆盖。SQL 阅读器很简单,如下所示:

    public class ReadBuildInfosConvention : ConventionInputCommandOperation
    {
        public ReadBuildInfosConvention(ConnectionStringSettings csSettings) : base(csSettings)
        {
            Command = "SELECT [Key], [Value] FROM BuildInfos WITH (NOLOCK);";
        }
    }
    

因为基本Execute方法已经适当地处理了 DB Read

    public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
    {
        using (IDbConnection connection = Use.Connection(ConnectionStringSettings))
        using (IDbTransaction transaction = BeginTransaction(connection))
        {
            using (currentCommand = connection.CreateCommand())
            {
                currentCommand.Transaction = transaction;
                PrepareCommand(currentCommand);
                using (IDataReader reader = currentCommand.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        yield return CreateRowFromReader(reader);
                    }
                }
            }

            if (transaction != null) transaction.Commit();
        }
    }

这是一个带有 logging 的有效 VS 解决方案

于 2018-06-23T03:05:29.630 回答