É possível criar um arquivo nativo do SQL Server a partir de c # (como formato nativo BCP)
-
05-07-2019 - |
Pergunta
Estamos a actualizar um código-base 15 anos de idade, há uma exigência para criar algum BCP nativa arquivos de dados formatados.
No novo sistema, nós realmente gostaria de utilizar os dados em um objeto C # DataTable para criar o arquivo de dados em formato BCP nativa.
Isso pode ser feito e se assim for, qual seria a melhor abordagem?
Solução
Não, não pode ser feito, a única maneira que nós descobrimos para criar arquivos BCP nativas é usando SQL Server. Se alguém desenvolve ou encontra outra maneira por favor poste aqui!
Outras dicas
Se é tão velho, em seguida, peça BCP pode parecer muito com um pedaço Sybase BCP. Em Sybase eu começar a olhar para libaries cliente e exemplos enviados de código usando BCP API. frascos CTLIB e / ou Java para API correspondente. Para a Microsoft, pode haver um porções semelhantes de C nativo ou API básico envolvendo BCP. Você pode não precisar a parte de comunicação da API, apenas registro por registro preparação e lê / escreve para o arquivo.
Se não existe tal coisa, então eu consideraria formato não-nativa com a mão feito arquivos FMT e texto-como arquivos de dados, produzido / consumido pelo programa BCP originais.
Há uma maneira semelhante ao fazer isso, mas você tem que fazer referência SQLDMO e ele irá criar um modelo equivalente apenas como BCP. Usando o objeto BulkCopy do SQLDMO, você pode fazer o que você está procurando. Aqui está um link para a rotina feito no VBScript que utiliza a biblioteca SQLDMO aqui .
Espero que isso ajude, Cumprimentos, Tom.
Você é capaz de colocar os dados na tabela de dados em uma área de teste em um SQL Server? Se assim for, você pode gerar fora de um processo BCP.
BCP: http://msdn.microsoft .com / en-us / library / aa174646% 28SQL.80% 29.aspx
Por exemplo, eu uso:
BCP Database.Schema.TableName OUT FileName.Ext -S ServerName -T -n
Switches:
- -s é para o servidor
- -T é para conexão confiável
- -n é para o formato nativo
Editar + New Idea:
Se você tem acesso às consultas que encher a tabela de dados, você pode usar aqueles com BCP ou SQLDMO para exportar um arquivo de formato nativo. As consultas a seguir usar a opção queryout em vez do interruptor OUT porque contêm em linha consultas
colunas específicas de exportação de um ponto de vista:
BCP "SELECT Column1, Column2 FROM MyViewName" QUERYOUT FileName.Ext -S ServerName -T -n
colunas específicas de exportação a partir de um JOIN:
BCP "SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 on Table1.Column33 = Table2.Column33" QUERYOUT FileName.Ext -S ServerName -T -n
supondo que você só fixa com tipos de coluna na tabela de destino, nada anulável, sem strings unicode, e estão dispostos a lidar com endian-ness, então o formato de arquivo nativo é apenas os bytes dos tipos.
i recentemente granel dados importados de um script c # escrevendo um arquivo temporário byte a byte e usando BCP
bcp destTable in model.raw -T -S _serverName -n
model.raw iscreated byte-wise por:
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);