Возможно ли создать собственный файл SQL Server из c # (например, собственный формат BCP)
-
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);