Как читать из таблицы 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 ошибки:
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));
Авторский блог завершен.
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 с журналированием.