none
Copiar certos dados de uma tabela e jogar para outra e em outro banco de dados RRS feed

  • Pergunta

  • Olá

    Preciso tirar alguns dados de uma tabela e jogar em outra e em outro banco

    Por exemplo

    preciso pegar o id o nome e o endereço de um cliente na tabela clientes do banco 1 e jogar na tabela clientes do banco 2

    Poderiam me ajudar?

    quinta-feira, 14 de março de 2013 16:59

Respostas

Todas as Respostas

  • amigo algumas maneiras

    idéia é você fazer um select, salvar em 1 data table, 

    e do datatable executar os insert para a outra tabela...

    2 - procura uma ferramenta no seu banco de dados para você extrair os insert into ( ou o backup ) da tabela e importar para o segundo bd..

    Espero ajudar

    Abraços !


    Att, Afonso Fernandes.

    quinta-feira, 14 de março de 2013 18:16
  • Cara,

    Para acessarmos outra tabela de outro banco utilizamos a seguinte sintaxe:

    MeuBanco..MinhaTabela

    Você pode fazer um insert comum na sua tabela X pegando de uma tabela Y em outro banco.

    Exemplo:

    INSERT INTO TABELA(ID, NOME, ENDERECO)
    SELECT ID, NOME, ENDERECO FROM MEUBANCO2..MINHATABELA
    WHERE ..


    Atenciosamente, Samuel dos Anjos

    quinta-feira, 14 de março de 2013 18:36
  • a forma correcta seria usando este class : SqlBulkCopy Class

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx


    A flower cannot blossom without sunshine, and man cannot live without love.

    quinta-feira, 21 de março de 2013 15:32
    Moderador
  • Pessoal,

    Não creio que exista a forma mais correta ou não, mas sim as melhores práticas para se aproveitar tanto a parte de banco quanto a de programação.

    Como o Levi informou, via programação para aproveitar mais do framework a melhor pratica é o uso do SqlBulkCopy.

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

    Porém se for direto no banco, uma das praticas utilizadas é a que postei acima também.

    INSERT INTO TABELA(ID, NOME, ENDERECO)
    SELECT ID, NOME, ENDERECO FROM MEUBANCO2..MINHATABELA
    WHERE ..


    Atenciosamente, Samuel dos Anjos

    quinta-feira, 21 de março de 2013 16:19
  • @Samuel Dos Anjos

    Nao foi minha intencao ignorar seu posto. Peco desculpa se o fiz. 

    Tens trabalhado muito pra comunidade, gosto dos teus threads. A tua sugestao esta correcta tambem. 

    Continua com o teu trabalho.


    A flower cannot blossom without sunshine, and man cannot live without love.

    quinta-feira, 21 de março de 2013 22:30
    Moderador
  • Levi,

    Claro que não houve nenhum desentendimento da minha parte, apenas queria deixar algumas outras formas das praticas que podemos utilizar para tal procedimento.

    Não se preocupe meu caro, estamos juntos tentando melhorar a qualidade do fórum sem dúvidas. Porém ainda estou longe de muitos conhecimentos que possui. Mas não deixarei de aprender sobre o que fazemos nessa área.

    Bora pra frente...


    Atenciosamente, Samuel dos Anjos

    quinta-feira, 21 de março de 2013 22:54
  • Obrigado Samuel dos Anjos 

    Estou estudando c# e tenho esse desafio para fazer porem ainda naum entendi muito bem

    Olha o que preciso

    ---------------------------------------------------------------------------------------------------------------------

    No Banco 1 tenho a Tabela 1 com os seguintes campos
    Codigo Nome Cpf Endereco Numero Bairro Cidade Estado Cep Obs

    No Banco 2 tenho a Tabela 2 Com  os seguintes campos
    Codigo Nome Cpf Endereco Bairro Cidade Estado Cep Telefone Email

    ------------------------------------------------------------------------------------------------------------------------

    Preciso copiar os dados do banco 1 e joga-los no banco 2 porem eles não estão na mesma ordem

    Estou nesse dilema

    Se puder me ajudar agradeço

    segunda-feira, 1 de abril de 2013 16:36
  • Cara,

    Se você não for utilizar o método que o Levi informou mas sim o que postei como outra opção, apenas faça isso:

    INSERT INTO Banco2..TABELA2(Codigo, Nome, Endereco, Bairro, Cidade, Estado, Cep)
    SELECT Codigo, Nome, Endereco, Bairro, Cidade, Estado, Cep FROM Banco1..TABELA1
    WHERE ..

    Obs.

    Se for copiar todos os dados, você não precisa da clausula Where conforme ai em cima.

    Troque os nomes Banco1 e Banco2 pelos nomes dos bancos e Tabela1 e Tabela2 pelos nomes das tabelas.

    Observe que eu defini a ordem dos dados que devem ser inseridos, você não precisa necessariamente preencher todos os dados a não ser que a tabela não aceite valores nulos.


    Atenciosamente,

    Samuel dos Anjos


    segunda-feira, 1 de abril de 2013 20:28
  • Nossa ta mais dificil do que eu pensei

    ate agora so consegui a parte da conexao da uma olhada

    private void bt_converter_clientes_Click(object sender, EventArgs e)
            {
                String EndBanco = tb_bd_origem.Text;
                String Usuario_origem = tb_usuario_origem.Text;
                String Senha_origem = tb_senha_origem.Text;
                String UserAndSenha = (Usuario_origem + Senha_origem);
                String EndBancoDestino = tb_bd_destino.Text;
                String Usuario_destino = tb_usuario_destino.Text;
                String Senha_destino = tb_senha_destino.Text;
                String BancoDados = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + EndBanco + ";User Id=" + Usuario_origem + ";Jet OLEDB:Database Password=" + Senha_origem;
                String BancoDadosDestino = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + EndBancoDestino + "; User Id=" + Usuario_destino + ";Jet OLEDB:Database Password=" + Senha_destino;
    
                //Iniciando Conexão
                //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                OleDbConnection ConectarOrigem = new OleDbConnection(BancoDados);
                OleDbConnection ConectarDestino = new OleDbConnection(BancoDadosDestino);
                try
                {
    
                    ConectarOrigem.Open();
                    ConectarDestino.Open();
                    MessageBox.Show("Bancos conectados com sucesso", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch
                {
                    MessageBox.Show("Erro ao se conectar", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
                //Iniciando a Copia
                //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
                //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
                //Fechando a conexão
                //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                try
                {
                    MessageBox.Show("Iniciando a desconecção", "Fechando as conexões", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    ConectarOrigem.Close();
                    ConectarDestino.Close();
                    MessageBox.Show("Bancos desconectados com sucesso", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch
                {
                    MessageBox.Show("Erro ao se desconectar", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
    
                //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            
            }

    Não consegui fazer a parte em que copio os dados

    :/

    segunda-feira, 1 de abril de 2013 21:09
  • segunda-feira, 1 de abril de 2013 23:07
  • Acho que devo estar fazendo algo errado pois da um erro

    "Keyword not supported: 'provider'."

    Segue o codigo que fiz

    private void bt_converter_clientes_Click(object sender, EventArgs e)
            {
                String EndBanco = tb_bd_origem.Text;
                String Usuario_origem = tb_usuario_origem.Text;
                String Senha_origem = tb_senha_origem.Text;
                String UserAndSenha = (Usuario_origem + Senha_origem);
                String EndBancoDestino = tb_bd_destino.Text;
                String Usuario_destino = tb_usuario_destino.Text;
                String Senha_destino = tb_senha_destino.Text;
                String BancoDados = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + EndBanco + ";User Id=" + Usuario_origem + ";Jet OLEDB:Database Password=" + Senha_origem;
                String BancoDadosDestino = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + EndBancoDestino + "; User Id=" + Usuario_destino + ";Jet OLEDB:Database Password=" + Senha_destino;
                //String BancoDadosDestino = @"Driver={Microsoft Access Driver (*.mdb)}; Dbq= "+ EndBancoDestino + ";Exclusive=1; Uid=" + Usuario_destino + ";Pwd=" + Senha_destino;
                //Iniciando Conexão
                //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                //Cria o datatable  
                DataTable sourceData = new DataTable();
                //criando as conexoes
                OleDbConnection ConectarOrigem = new OleDbConnection(BancoDados);
                OleDbConnection ConectarDestino = new OleDbConnection(BancoDadosDestino);
                //criando a instrucao do comando
                string instrucaoorigem = "SELECT numero FROM Clientes";
                //criando o comando
                OleDbCommand sqlorigem = new OleDbCommand(instrucaoorigem,ConectarOrigem);
                //abre a conexao
                ConectarOrigem.Open();
                //cria o datareader
                OleDbDataReader dr_origem = sqlorigem.ExecuteReader();
               // dr_origem = sqlorigem.ExecuteReader();
                //abrindo a conexao de destino
                ConectarDestino.Open();
                //criando o bulkcopy
    
                SqlBulkCopy bdcopy = new SqlBulkCopy(ConectarDestino.ConnectionString);
                
                {
                    bdcopy.ColumnMappings.Add("Codigo","Codigo");
                    bdcopy.ColumnMappings.Add("Nome", "Nome");
                    bdcopy.DestinationTableName = "Clientes";
                    bdcopy.WriteToServer(dr_origem);
                }
                            
                dr_origem.Close();
    }

    O que eu fiz de errado??

    terça-feira, 2 de abril de 2013 10:27
  • terça-feira, 2 de abril de 2013 18:29
  • Consegui fazer com um modelo q achei na internet porem ele so copia se as tabelas forem de colunas iguais, mais a minha os campos não estao na mesma posição , estou penando pra definir em qual coluna vai ser colada na tabela 2 ou seja na tabela vazia 

    esse é o que eu achei

    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Windows.Forms;
    using System.Text;
    
    namespace Testes
    {
        class clsDados
        {
            //ESTOU USANDO OLEDB mas você pode adaptar para o que você estiver usando!
            public void Gravar()
            {
                //String de conexão : Adapte para a sua conexão!
                string conn = "Provider=ASAProv.90;Eng=TESTE01;Uid=DBA;Pwd=SQL; Links=tcpip(Host=localhost);";
    
                //string do Comando SQL da tabela Cheia
                string strTabelaCheia = "SELECT * FROM TABELA1";
                //string strTabelaCheia = "SELECT * FROM GES_044";
    
                //string do Comando SQL da tabela Vazia
                string strTabelaVazia = "SELECT * FROM TABELA2";
                //string strTabelaVazia = "SELECT * FROM GES_0044";
    
                //Objeto Connection
                OleDbConnection conexao = new OleDbConnection(conn);
    
                //Tabela com todos os registros
                DataTable dtTabela1 = new DataTable();
    
                //Tabela sem nenhum regitro
                DataTable dtTabela2 = new DataTable();
    
                try
                {
    
                    //Abre a conexão com o BD
                    conexao.Open();
                    //Cria dois objeto DataAdapter passando por paramentro o comando SQL e a conexão aberta com o BD
                    OleDbDataAdapter daTabelaCheia = new OleDbDataAdapter(strTabelaCheia, conexao);
                    OleDbDataAdapter daTabelaVazia = new OleDbDataAdapter(strTabelaVazia, conexao);
    
                    //Veja que não criei o comando de insert para a tabela vazia...
                    //O CommandBuilder se encarrega de criar os comando para nós, basta passar um SELECT da tabela para o DataAdapter!
                    OleDbCommandBuilder cbTabelaVazia = new OleDbCommandBuilder(daTabelaVazia);
    
                    //Agora vamos preecher os DataTable com todos os registros das tabelas
                    //Observe que mesmo que a tabela2 não tenha registro faço isto para mapear os campos da tabela.
                    daTabelaCheia.Fill(dtTabela1);
                    daTabelaVazia.Fill(dtTabela2);
    
                    //Agora vamos percorrer todos os dados da TabelaCheia
                    for (int i = 0; i < dtTabela1.Rows.Count; i++)
                    {
                        //Criaremos uma nova linha para ser adicionada na tabela vazia
                        DataRow dr = dtTabela2.NewRow();
                        //Percorre todos os campos e adiciona os valores na row
                        for (int j = 0; j < dtTabela1.Rows[i].ItemArray.Length; j++)
                        {
                            dr[j] = dtTabela1.Rows[i].ItemArray.GetValue(j);
                        }
                        //Efetiva a Gravação no DB
                        dtTabela2.Rows.Add(dr);
                    }
    
                    //Assinamos o evento após a inclusão para ver se ocorreu erros
                    daTabelaVazia.RowUpdated += new OleDbRowUpdatedEventHandler(daTabelaVazia_RowUpdated);
    
                    //Executamos o método Update do DataTable para efetivar a gravação no BD
                    daTabelaVazia.Update(dtTabela2);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if(conexao.State != ConnectionState.Closed)
                        conexao.Close();
                }
            }
    
            //Médoto para executar quando o evento for disparado
            void daTabelaVazia_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
            {
                if (e.Status == UpdateStatus.ErrorsOccurred)
                {
                    MessageBox.Show("ocorreu o seguinte erro: " + e.Errors.Message);
                    e.Row.RowError = e.Errors.Message;
                    e.Status = UpdateStatus.SkipCurrentRow;
                }
            }
        }
    }


    quinta-feira, 4 de abril de 2013 18:45
  • Boa tarde.
    Você pode transferir os dados utilizando SqlBulkCopy, utilizei algumas vezes e funcionou perfeitamente:

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

    http://blogs.msdn.com/b/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspx

    http://www.codeproject.com/Articles/18418/Transferring-Data-Using-SqlBulkCopy

    []'s


    Se a minha postagem ajudou, marque-a como resposta ou vote como útil.

    quinta-feira, 4 de abril de 2013 19:26
  • Ola Rafael P. , tentei utilizar esse SqlBulkCopy, porem da um erro dizendo que o provedor não suporta 

    utilizo duas bases access e conexoes oledb

    aparece esse erro

    "Keyword not supported: 'provider'."

    Ai vai a classe completa

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.OleDb;
    using System.Data;
    using System.Configuration;
    using System.Data.SqlTypes;
    using System.Data.Sql;
    using System.Data.SqlClient;
    using System.Data;
    using System.Data.Odbc;
    
    namespace Conversor_Sat_Sistemas
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void bt_localizar_origem_Click(object sender, EventArgs e)
            {
                //define as propriedades do controle 
                //OpenFileDialog
                this.abrir_bd_origem.Multiselect = false;
                this.abrir_bd_origem.Title = "Selecionar Banco de Origem";
                abrir_bd_origem.InitialDirectory = @"C:\SAT";
                //filtra para exibir somente arquivos de imagens
                abrir_bd_origem.Filter = "Banco de dados (*.mdb)|*.MDB|" + "All files (*.*)|*.*";
                abrir_bd_origem.CheckFileExists = true;
                abrir_bd_origem.CheckPathExists = true;
                abrir_bd_origem.FilterIndex = 2;
                abrir_bd_origem.RestoreDirectory = true;
                abrir_bd_origem.ReadOnlyChecked = true;
                abrir_bd_origem.ShowReadOnly = true;
    
                DialogResult dr = this.abrir_bd_origem.ShowDialog();
    
                if (dr == System.Windows.Forms.DialogResult.OK)
                {
                    // Le os arquivos selecionados 
                    foreach (String arquivo in abrir_bd_origem.FileNames)
                    {
                        tb_bd_origem.Text += arquivo;
                        
                    }
    
    
                }
            }
    
            private void bt_localizar_destino_Click(object sender, EventArgs e)
            {
                //define as propriedades do controle 
                //OpenFileDialog
                this.abrir_bd_destino.Multiselect = false;
                this.abrir_bd_destino.Title = "Selecionar Banco de Origem";
                abrir_bd_destino.InitialDirectory = @"C:\SAT";
                //filtra para exibir somente arquivos de imagens
                abrir_bd_destino.Filter = "Banco de dados (*.mdb)|*.MDB|" + "All files (*.*)|*.*";
                abrir_bd_destino.CheckFileExists = true;
                abrir_bd_destino.CheckPathExists = true;
                abrir_bd_destino.FilterIndex = 2;
                abrir_bd_destino.RestoreDirectory = true;
                abrir_bd_destino.ReadOnlyChecked = true;
                abrir_bd_destino.ShowReadOnly = true;
    
                DialogResult dr = this.abrir_bd_destino.ShowDialog();
    
                if (dr == System.Windows.Forms.DialogResult.OK)
                {
                    // Le os arquivos selecionados 
                    foreach (String arquivo in abrir_bd_destino.FileNames)
                    {
                        tb_bd_destino.Text += arquivo;
                        
                    }
    
    
                }
            }
    
    
            private void bt_converter_clientes_Click(object sender, EventArgs e)
            {
                String EndBanco = tb_bd_origem.Text;
                String Usuario_origem = tb_usuario_origem.Text;
                String Senha_origem = tb_senha_origem.Text;
                String UserAndSenha = (Usuario_origem + Senha_origem);
                String EndBancoDestino = tb_bd_destino.Text;
                String Usuario_destino = tb_usuario_destino.Text;
                String Senha_destino = tb_senha_destino.Text;
                String BancoDados = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + EndBanco + ";User Id=" + Usuario_origem + ";Jet OLEDB:Database Password=" + Senha_origem;
                String BancoDadosDestino = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + EndBancoDestino + "; User Id=" + Usuario_destino + ";Jet OLEDB:Database Password=" + Senha_destino;
                
                //string destino = tb_bd_destino.Text;
                //String BancoDadosDestino = @"Driver={Microsoft Access Driver (*.mdb)}; Dbq= "+ EndBancoDestino + ";Exclusive=1; Uid=" + Usuario_destino + ";Pwd=" + Senha_destino;
                //Iniciando Conexão
                //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                //Cria o datatable  
                using (DataTable sourceData = new DataTable())
                {
                }
                //criando as conexoes
                OleDbConnection ConectarOrigem = new OleDbConnection(BancoDados);
                OleDbConnection ConectarDestino = new OleDbConnection(BancoDadosDestino);
               // OdbcConnection ConectarDestino = new OdbcConnection(Destino);
                //criando a instrucao do comando
                string instrucaoorigem = "SELECT numero, nome FROM Clientes";
                //criando o comando
                OleDbCommand sqlorigem = new OleDbCommand(instrucaoorigem,ConectarOrigem);
                //abre a conexao
                ConectarOrigem.Open();
                //cria o datareader
                OleDbDataReader dr_origem = sqlorigem.ExecuteReader();
               // dr_origem = sqlorigem.ExecuteReader();
                //abrindo a conexao de destino
                ConectarDestino.Open();
                
                
                //criando o bulkcopy
                
    
                    SqlBulkCopy bdcopy = new SqlBulkCopy(ConectarDestino.ConnectionString);
                
                {
                    bdcopy.ColumnMappings.Add("numero","Codigo");
                    bdcopy.ColumnMappings.Add("Nome", "Nome");
                    bdcopy.DestinationTableName = "Clientes";
                    bdcopy.WriteToServer(dr_origem);
                }
                            
                dr_origem.Close();
    }
            
                
                
    
    
    
            private void tb_bd_origem_TextChanged(object sender, EventArgs e)
            {
            
            }
            
        }
    
    }
    


    quinta-feira, 4 de abril de 2013 19:48