Как читать из таблицы SQL Server с каркасом RhinoETL?

Многие примеры кода на 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;
        }
    }
}

1 ответ

Решение

Оказывается, после отладки непосредственно с Rhino.Etl я сделал 2 ошибки:

  1. ConnectionStringSettings должны включать providerName, RhinoETL бросил исключение по этому поводу, но я почему-то не вижу его

        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 Reader так же просто, как показано ниже:

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

потому что база Execute метод уже обрабатывает БД

    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();
        }
    }

Вот рабочее решение VS с журналированием.

Другие вопросы по тегам