Хорошо, я попытаюсь объяснить это как можно лучше. Я написал приложение, которое использует таблицу SQL для определения структуры источника данных с фиксированной шириной (так, заголовок, начальный индекс, длина поля и т. Д.). Когда мое приложение запускается, оно запрашивает эту таблицу и создает объект DataTable (назовите его finalDT
) с объектами DataColumn, содержащими столбец ColumnName =. Затем я добавляю в эту таблицу набор объектов DataColumn, которые существуют в каждом используемом нами источнике данных (который я называю производными столбцами). Я также создаю поле первичного ключа, которое является автоматически увеличивающимся целым числом. Первоначально я перекатил свое собственное решение, чтобы прочитать файл фиксированной ширины, но пытаюсь преобразовать его в FileHelper. В основном, я хочу включить его, чтобы иметь доступ к другим типам файлов, которые может обрабатывать FileHelper (CSV, Excel и т. Д.).Использование FileHelpers.Dynamic, чтение файла фиксированной ширины и загрузка на SQL
Теперь, моя проблема. Используя FileHelper.Dynamic, я был в состоянии создать объект FileHelperEngine, используя следующий метод:
private static FileHelperEngine GetFixedWidthFileClass(bool ignore)
{
singletonArguments sArgs = singletonArguments.sArgs;
singletonSQL sSQL = singletonSQL.sSQL;
List<string> remove = new List<string>();
FixedLengthClassBuilder flcb = new FixedLengthClassBuilder(sSQL.FixedDataDefinition.DataTableName);
flcb.IgnoreFirstLines = 1;
flcb.IgnoreLastLines = 1;
flcb.IgnoreEmptyLines = true;
foreach (var dcs in sSQL.FixedDataDefinition.Columns)
{
flcb.AddField(dcs.header, Convert.ToInt32(dcs.length), "String");
if (ignore && dcs.ignore)
{
flcb.LastField.FieldValueDiscarded = true; //If we want to ignore a column, this is how to do it. Would like to incorporate this.
flcb.LastField.Visibility = NetVisibility.Protected;
}
else
{
flcb.LastField.TrimMode = TrimMode.Both;
flcb.LastField.FieldNullValue = string.Empty;
}
}
return new FileHelperEngine(flcb.CreateRecordClass());
}
sSQL.FixedDataDefinition.Columns
как я храню определение полей для источника данных файла фиксированной ширины. Затем я генерировать DataTable, выполнив:
DataTable dt = engine.ReadFileAsDT(file);
, где находится file
полный путь к фиксированной ширины файла и engine
в котором хранятся результаты от метода GetFixedWidthFileClass()
показанного выше. Хорошо, теперь у меня есть DataTable без первичного ключа и ни одного из полученных столбцов. Кроме того, все поля в dt
отмечены как ReadOnly = true
. Здесь все становится беспорядком.
Мне нужно набрать dt
в finalDT
, и с dt
должно быть в порядке, не имея информации о главном ключе. Если это может произойти, я могу использовать finalDT
для загрузки моих данных в таблицу SQL. Если этого не может быть, тогда мне нужен способ для finalDT
, чтобы не иметь Первичного ключа, но все равно загружайте его в таблицу SQL. Будет ли SqlBulkCopy
разрешить это? Есть ли другой способ?
На этом этапе я готов начать с нуля, пока я могу использовать FileHelper для анализа файла фиксированной ширины, и результаты сохраняются в моей таблице SQL, я просто не вижу пути туда.