Rhino ETL - загрузка больших файлов с разделителями каналов

Мы должны загрузить большие файлы с разделителями трубы. При загрузке их в БД SQL Server с использованием Rhino ETL (полагаясь на FileHelpers), обязательно ли указывать класс записи? Мы должны загружать файлы в разные таблицы, которые имеют десятки столбцов - на их генерацию может уйти целый день. Я предполагаю, что мы можем написать небольшой инструмент для генерации классов записей из таблиц SQL Server.

Другой подход - написать оболочку IDataReader для FileStream и передать ее в SqlBulkCopy.

SqlBulkCopy также требует сопоставления столбцов, но допускает порядковые номера столбцов - это легко.

Есть идеи / предложения?

Благодарю.

1 ответ

Я не знаю много о Rhino ETL, но FileHelpers имеет ClassBuilder который позволяет генерировать класс записи во время выполнения. Смотрите документацию для некоторых примеров.

Так что было бы легко создать класс с чем-то вроде следующего:

SqlCommand command = new SqlCommand("SELECT TOP 1 * FROM Customers;", connection);
connection.Open();

// get the schema for the customers table
SqlDataReader reader = command.ExecuteReader();
DataTable schemaTable = reader.GetSchemaTable();

// create the FileHelpers record class
// alternatively there is a 'FixedClassBuilder'
DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ","); 
cb.IgnoreFirstLines = 1; 
cb.IgnoreEmptyLines = true; 

// populate the fields based on the columns
foreach (DataRow row in schemaTable.Rows)
{
     cb.AddField(row.Field<string>("ColumnName"), row.Field<Type>("DataType")); 
     cb.LastField.TrimMode = TrimMode.Both;
}

// load the dynamically created class into a FileHelpers engine
FileHelperEngine engine = new FileHelperEngine(cb.CreateRecordClass());

// import your records
DataTable dt = engine.ReadFileAsDT("testCustomers.txt"); 
Другие вопросы по тегам