Можно ли создать собственный файл SQL Server из c # (например, собственный формат BCP) - PullRequest
2 голосов
/ 28 ноября 2009

Мы обновляем 15-летнюю кодовую базу, необходимо создать некоторые файлы данных в формате BCP.

В новой системе в идеале мы хотели бы использовать данные в объекте C # DataTable для создания файла данных в собственном формате BCP.

Можно ли это сделать, и если да, то какой подход будет наилучшим?

Ответы [ 5 ]

3 голосов
/ 14 января 2010

Нет, этого нельзя сделать, единственный способ, с помощью которого мы обнаружили создание собственных файлов BCP, - это использование SQL Server. Если кто-то разрабатывает или находит другой путь, пожалуйста, отправьте его здесь!

0 голосов
/ 22 марта 2017

при условии, что вы исправили только с типами столбцов в таблице назначения, ничего не обнулялись, не были строки в юникоде и готовы обрабатывать endian-ness, тогда нативный формат файла - это только байты типов.

я недавно массово импортировал данные из скрипта c #, написав побайтный файл промежуточного файла и используя BCP

bcp destTable in model.raw -T -S _serverName -n

model.raw создается побайтно:

fileBytes = new byte[theLength * 4]; // * 4 bytes per element for int and float
var offset =0;

    foreach (var element in outputDimensions)
    {
        // fastCopy is a faster and "Unsafe" equivelent of BlockCopy , faster because it doesn't create an intermediate byte array.
        //Buffer.BlockCopy(BitConverter.GetBytes(profileid), 0, fileBytes, offset, 4);
        Utilities.fastCopy(profileid, fileBytes, offset);
        offset += 4;
        Utilities.fastCopy(element.index, fileBytes, offset);
        offset += 4;
        for (var i = 0; i < TimeSlices; i++, offset += 4)
        {
            float target = GetDataForTime(i,...);
            Utilities.fastCopy(target, fileBytes, offset); 
        }
    }

FileStream dataWriter.Write(fileBytes , 0, byteArray.Length);
0 голосов
/ 28 ноября 2009

Если он такой старый, то часть BCP может очень сильно походить на часть BCP Sybase. В Sybase я начал смотреть на клиентские библиотеки и отправлять примеры кода с использованием BCP API. CTLib и / или Java jar для соответствующего API. Для Microsoft могут существовать аналогичные части нативного C или Basic API с использованием BCP. Вам может не понадобиться коммуникационная часть API, просто подготовка к записи по записи и чтение / запись в файл.

Если такой вещи нет, то я бы рассмотрел нестандартный формат с файлами FMT, созданными вручную, и текстовыми файлами данных, созданными / использованными в оригинальной программе BCP.

0 голосов
/ 28 ноября 2009

Есть аналогичный способ сделать это, но вы должны ссылаться на SQLDMO, и он создаст эквивалентный формат, такой же, как BCP. Используя объект BulkCopy объекта SQLDMO, вы можете делать то, что ищете. Вот ссылка на процедуру, выполняемую в vbscript, которая использует библиотеку SQLDMO здесь .

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 28 ноября 2009

Можете ли вы поместить данные из таблицы данных в промежуточную область на SQL Server? Если это так, вы можете запустить процесс BCP.

ППГ: http://msdn.microsoft.com/en-us/library/aa174646%28SQL.80%29.aspx

Например, я использую:

BCP Database.Schema.TableName OUT FileName.Ext -S ServerName -T -n

Переключатели:

  • -S для сервера
  • -T для доверенного соединения
  • -n для родного формата

РЕДАКТИРОВАТЬ + Новая идея:

Если у вас есть доступ к запросам, которые заполняют таблицу данных, вы можете использовать их с BCP или SQLDMO для экспорта файла собственного формата. В следующих запросах вместо переключателя OUT используется переключатель QUERYOUT, поскольку они содержат встроенные запросы

Экспорт определенных столбцов из вида:

BCP "SELECT Column1, Column2 FROM MyViewName" QUERYOUT FileName.Ext -S ServerName -T -n

Экспорт определенных столбцов из JOIN:

BCP "SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 on Table1.Column33 = Table2.Column33" QUERYOUT FileName.Ext -S ServerName -T -n
...