É possível criar um arquivo nativo do SQL Server a partir de c # (como formato nativo BCP)

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

  •  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?

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top