none
Dica Insert RRS feed

  • Pergunta

  • Bom dia Galera,

    Tenho 2 servidores e preciso fazer um insert de um banco de dados do servidor X para o Y , isso dentro da minha aplicação C#.

    Como eu poderia fazer isso ?

    Alguem tem alguma ideia.

    Só não poderia ser feito com linked server

    Abs

    sexta-feira, 7 de outubro de 2016 13:30

Respostas

  • Terá que fazer 3 passos:

    1) Você faz a consulta em uma das bases de dados (Usando a connectionString que aponta para aquele servidor);

    2) Salvar o resultado dessa consulta em um datatable ou alguma estrutura que armazene os dados que quer copiar;

    3) Fazer o insert na outra base de dados (Usando uma outra connectionString que aponta para servidor de destino dos dados)

    Exemplo de consulta e armazenamento dos dados em datatable:

    public DataTable GetData()
    {
        SqlConnection conn = new SqlConnection("SUA_CONNECTION_STRING_DO_SERVIDOR_FONTE_DOS_DADOS");
        conn.Open();
        string query = "SUA_CONSULTA_SQL";
        SqlCommand cmd = new SqlCommand(query, conn);
    
        DataTable dt = new DataTable();
        dt.Load(cmd.ExecuteReader());
        return dt;
    }

    Podes fazer o insert dessa forma na nova base de dados:

    OBS: O código abaixo vai servir casos suas tabelas sejam idênticas, caso contrario terá que personalizar

    using (var bulkCopy = new SqlBulkCopy("SUA_CONNECTION_STRING_DO_SERVIDOR_DE_DESTINO_DOS_DADOS", SqlBulkCopyOptions.KeepIdentity))
    {
          DataTable table = GetData();
          foreach (DataColumn col in table.Columns)
          {
              bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
          }
          bulkCopy.BulkCopyTimeout = 600;
          bulkCopy.DestinationTableName = "NOME_DA_TABELA_DE_DESTINO";
          bulkCopy.WriteToServer(table);
    }

    Espero ter ajudado!

    Valeu!



    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco




    sexta-feira, 7 de outubro de 2016 14:16

Todas as Respostas

  • Olá,

    Você pode definir duas conexões (através de connections strings apontando para cada servidor) e fazer o insert em ambas, já que não pode utilizar linkedserver, acredito que tenha que fazer dessa forma.

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    sexta-feira, 7 de outubro de 2016 13:32
  • Grato pela ajuda.

    Desculpe mas não entendi.

    Como fazer insert em ambas ?

    sexta-feira, 7 de outubro de 2016 13:49
  • Nao entendi... Voce precisa inserir a mesma informaçcao nos dois servidores?

    É isso?

    Ou voce quer fazer a transferencia de dados de um para o outro?


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    sexta-feira, 7 de outubro de 2016 14:11
    Moderador
  • Teria algum exemplo de como fazer isso 
    sexta-feira, 7 de outubro de 2016 14:11
  • Não.

    Eu tenho o servidor A e o servidor B.

    Preciso efetuar um select no servidor A para poder inserir no servidor B, isso dentro da minha aplicação C#.

    Entendeu ?

    sexta-feira, 7 de outubro de 2016 14:13
  • Terá que fazer 3 passos:

    1) Você faz a consulta em uma das bases de dados (Usando a connectionString que aponta para aquele servidor);

    2) Salvar o resultado dessa consulta em um datatable ou alguma estrutura que armazene os dados que quer copiar;

    3) Fazer o insert na outra base de dados (Usando uma outra connectionString que aponta para servidor de destino dos dados)

    Exemplo de consulta e armazenamento dos dados em datatable:

    public DataTable GetData()
    {
        SqlConnection conn = new SqlConnection("SUA_CONNECTION_STRING_DO_SERVIDOR_FONTE_DOS_DADOS");
        conn.Open();
        string query = "SUA_CONSULTA_SQL";
        SqlCommand cmd = new SqlCommand(query, conn);
    
        DataTable dt = new DataTable();
        dt.Load(cmd.ExecuteReader());
        return dt;
    }

    Podes fazer o insert dessa forma na nova base de dados:

    OBS: O código abaixo vai servir casos suas tabelas sejam idênticas, caso contrario terá que personalizar

    using (var bulkCopy = new SqlBulkCopy("SUA_CONNECTION_STRING_DO_SERVIDOR_DE_DESTINO_DOS_DADOS", SqlBulkCopyOptions.KeepIdentity))
    {
          DataTable table = GetData();
          foreach (DataColumn col in table.Columns)
          {
              bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
          }
          bulkCopy.BulkCopyTimeout = 600;
          bulkCopy.DestinationTableName = "NOME_DA_TABELA_DE_DESTINO";
          bulkCopy.WriteToServer(table);
    }

    Espero ter ajudado!

    Valeu!



    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco




    sexta-feira, 7 de outubro de 2016 14:16
  • Voce pode fazer com duas conexoes (como o André sugeriu) ou criar um Linked server no no seu servidor B.

    Caso a segurança seja algo muito importante (algo como o servidor A é de uma aplicaçcao de terceiros) sugiro voce pensar em criar um WebService. Desta forma voce consegue um alto indice de abstraçcao.

    As vezes colocar duas conexoes na mesma aplicaçao nao é possivel por restirçoes na seguranca e a coisa fica pior se o Servidor B nao esta na mesma rede.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 7 de outubro de 2016 14:37
    Moderador