Как подготовить данные для команды массовой вставки


Я пытаюсь динамически записать все поля данной таблицы базы данных 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 2

1 ответ:

Я решил эту проблему. В вышеприведенном коде не было ничего плохого. Но я сохраню свой вопрос здесь для других, так как я не смог найти эквивалентное решение ни в одном из моих поисковиков google.

Моей особой проблемой было то, что после написания файлов я не всегда закрывал потоки файлов изящно с помощью FileStream.Метод Close или Dispose. Это вызвало некоторое повреждение конечных байтов файла, где данные еще не были сброшены на диск.

Использование последней строки параметр в команде SQL BULK INSERT позволил мне успешно импортировать все содержимое каждого файла вплоть до поврежденной строки. И правильное закрытие моих потоков файлов гарантирует, что это больше не повторится.