Быстрый способ записи таблицы сервера SQL в файл - PullRequest
1 голос
/ 22 февраля 2012

У меня есть удаленный сервер SQL. Я хочу сделать локальную копию всех таблиц на этом сервере. Меня не волнует формат файла, используемый локально, я ищу самый быстрый способ получения данных с сервера SQL в файл. (примечание: резервное копирование на стороне сервера недоступно)

Это мой текущий подход:

Шаг 1 . Создание считывателя и считывание всех данных в Список объектов

while (reader.Read()) {

    var fieldCount = reader.FieldCount;
    for (int i = 0; i < fieldCount; i++) {
        objects.Add(reader.GetValue(i));
    }
}

Шаг 2 . Преобразовать объекты в строки

List<string> test = new List<string>();
foreach (var o in objects) {
    test.Add(o.ToString());
}

Шаг 3 . Записать строку в (CSV) файл

foreach (var s in test) {
    backupFile.Write("\"");
    backupFile.Write(s);
    backupFile.Write("\";");
}

Я измерил производительность этих 3 шагов:

  • Шаг 1 занимает 3 секунды
  • Шаг 2 занимает 2,8 секунды
  • Шаг 3 занимает 0,8 секунды

Я ищу способ ускорить шаг 2. Есть ли более быстрый способ передачи этих объектов в файл? (не должен быть текстовым файлом. Двоичный файл локальной базы данных тоже в порядке)

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

Почему вы беспокоитесь о трех шагах точно.

Почему бы не

while (reader.Read()) {

    var fieldCount = reader.FieldCount;
    for (int i = 0; i < fieldCount; i++) {
           backupFile.Write("\"");
           backupFile.Write(reader.GetValue(i).ToString());
           backupFile.Write("\";");;
    }
    backupFile.WriteLine();
 }

Если, конечно, вы не используете два потока. Тот, который толкает данные в коллекцию. И тот, который сбрасывает данные в файл.

0 голосов
/ 22 февраля 2012

Используйте команду OPENROWSET.Пример:

INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=C:\testing.xls;', 
'SELECT Name, Date FROM [Sheet1$]') 
SELECT [Name], GETDATE() FROM MyTable
0 голосов
/ 22 февраля 2012

Если вас не волнует формат файла, используемый локально, как насчет загрузки таблицы SQL в объект DataTable и использования:

datatable.WriteXml("c:\YourFile.xml");
...