2009-11-27 3 views
2

Мы обновляем 15-летнюю базу кода, необходимо создать некоторые собственные файлы данных формата BCP.Возможно ли создать собственный файл SQL Server из C# (например, собственный формат BCP)

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

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

+0

Im любопытный , Зачем вам нужны данные в файле в формате Native? –

+0

Нижняя система настаивает на этом! – alchemical

ответ

3

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

0

Можете ли вы поместить данные в datatable в промежуточную область на SQL Server? Если это так, вы можете запустить процесс 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 для исходного формата

EDIT + Новая идея:

Если у вас есть доступ к запросам, которые заполняют DataTable, вы можете использовать те, с БКП или Sqldmo экспортировать из исходного файла формата. Следующие запросы используют переключатель 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 
+0

Есть ли способ сделать это с данными, поступающими из объекта C#, а не из БД? – alchemical

0

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

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

0

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

Надеюсь, это поможет, С уважением, Tom.

+0

Его данные находятся в виде данных в C# - это не в SQL Server. –

0

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

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

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

model.raw iscreated побайтно по:

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); 

 Смежные вопросы

  • Нет связанных вопросов^_^