Как подготовить данные для команды массовой вставки
Я пытаюсь динамически записать все поля данной таблицы базы данных SQL в файл, который впоследствии будет использоваться в качестве исходного файла для команды BULK INSERT.
Я использую SqlDataReader для чтения каждого поля, в котором хранится значение в виде объекта. В зависимости от типа объекта я записываю значение в файл. Вот код, который я сейчас использую:
StreamWriter writer = new StreamWriter(filePath, false, Encoding.GetEncoding("iso-8859-1");
foreach (var fields in rows)
{
foreach (object val in fields)
{
if (val != DBNull.Value)
{
if (val is bool)
writer.Write((bool)val ? 1 : 0);
else if (val is byte[])
writer.Write(BitConverter.ToString((byte[])val).Replace("-", ""));
else if (val is DateTime)
writer.Write(string.Format("{0} {1}", ((DateTime)val).ToString("yyyy-MM-dd"), ((DateTime)val).ToString("HH:mm:ss:fff")));
else if (val is string)
writer.Write(((string)val).Replace("", string.Empty));
else
writer.Write(val);
}
// Field terminator
writer.Write('');
}
}
Позже я выполняю команду BULK INSERT следующим образом:
BULK INSERT tableName
FROM 'c:fileName'
WITH (
FIELDTERMINATOR = ''
ROWTERMINATOR = ''
KEEPNULLS
);
Проблема у меня в том, что я иногда получаю ошибку во время основная вставка: "неожиданный конец файла". Это не происходит с каждой строкой или каждой таблицей.
Я хотел бы иметь возможность обрабатывать любой тип столбца с любым типом данных без ошибок.
1 ответ:
Я решил эту проблему. В вышеприведенном коде не было ничего плохого. Но я сохраню свой вопрос здесь для других, так как я не смог найти эквивалентное решение ни в одном из моих поисковиков google.
Моей особой проблемой было то, что после написания файлов я не всегда закрывал потоки файлов изящно с помощью FileStream.Метод Close или Dispose. Это вызвало некоторое повреждение конечных байтов файла, где данные еще не были сброшены на диск.
Использование последней строки параметр в команде SQL BULK INSERT позволил мне успешно импортировать все содержимое каждого файла вплоть до поврежденной строки. И правильное закрытие моих потоков файлов гарантирует, что это больше не повторится.