Возможно ли создать собственный файл SQL Server из c # (например, собственный формат BCP)

StackOverflow https://stackoverflow.com/questions/1810796

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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 для экспорта файла собственного формата.Следующие запросы используют переключатель QUERYOUT вместо переключателя OUT, поскольку они содержат встроенные запросы

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

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

Экспортируйте определенные столбцы из ОБЪЕДИНЕНИЯ:

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

Если вы исправили только с типами столбцов в целевой таблице, ничего не обнуляемыми, без юникодных строк и готовы обрабатывать 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top