Logo Hardware.com.br
Gabrielvinicios
Gabrielvinic... Geek Registrado
3.9K Mensagens 1 Curtida

C# - Como transferir do Data Table para o Banco de Dados todos os registros de uma vez?

#1 Por Gabrielvinic... 25/04/2015 - 15:45
Boa tarde a todos, tudo bem?



Tenho um sistema que roda em 2 máquinas, porém como elas não estão em redes (dificuldades do local) eu fiz com que o banco de dados da segunda possa ser salvo em um pendrive e ser importado para o banco de dados principal. Até ai tudo funcionou. Estou trabalhando com banco de Dados Access 2007 (.accdb)



Porém, em 15 dias foi gerado, ao todo, 12 mil registros. E a importação, linha por linha, de um banco para o outro, está demorando quase meia-hora!!! Imagine quando o banco crescer ainda mais! Está inviável!



O código que usei, à principio, foi este, onde ele preenche um Data Table com o conteúdo a ser importado e depois disso, importa, linha por linha, para o dataset do meu banco:

String conexao ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+@txtCaminho.Text+"; Persist Security Info=False;";String consultasql;
consultasql ="SELECT * from tblAnalises";

OleDbDataAdapter da =newOleDbDataAdapter(consultasql,conexao);
//Cria a dataTableDataTable dt =newDataTable();
da.Fill(dt);


Int32 j =0;Int32 i;
progressBar1.Maximum= dt.Rows.Count;
progressBar1.Value=0;


OLHO_NA_LATADataSet2.tblAnalisesRow linhaNova;

for(i =0; i < dt.Rows.Count; i++){
linhaNova = oLHO_NA_LATADataSet2.tblAnalises.NewtblAnalisesRow();

linhaNova.CodLinha=Convert.ToInt16(dt.Rows[i][1]);

linhaNova.Funcionario=Convert.ToInt32(dt.Rows[i][2]);
linhaNova.CódigoBarras =Convert.ToInt16(dt.Rows[i][3]);
linhaNova.Texto_Legivel=Convert.ToInt16(dt.Rows[i][4]);

linhaNova.LogoMarca=Convert.ToInt16(dt.Rows[i][5]);
linhaNova.CódigoData =Convert.ToInt16(dt.Rows[i][6]);
linhaNova.InteriorFundo=Convert.ToInt16(dt.Rows[i][7]);
linhaNova.MarcasImpressão =Convert.ToInt16(dt.Rows[i][8]);
linhaNova.data_hora =Convert.ToDateTime(dt.Rows[i][9]);
linhaNova.so_data =Convert.ToDateTime(dt.Rows[i][10]);
linhaNova.so_hora =Convert.ToDateTime(dt.Rows[i][11]);//
linhaNova.CódigoBarraLata =Convert.ToString(dt.Rows[i][12]);
progressBar1.Value++;


// lblContagem.Text = i.ToString() + " de " + dt.Rows.Count.ToString() ;

try{
oLHO_NA_LATADataSet2.tblAnalises.Rows.Add(linhaNova);//efetua a adição

this.tblAnalisesTableAdapter1.Update(linhaNova);//atualiza o table adapter}catch(Exception ex){
j++;//atualiza contagem de registros já existentes (j)}

}

oLHO_NA_LATADataSet2.AcceptChanges();


Como eu poderia fazer pra copiar, do Data Table, de uma vez só para o banco?

Eu consegui passar tudo pro Dataset, usando o código abaixo. Porém eu não consigo, uma vez que os dados estão no dataset, não consigo salvá-los efetivamente no banco!!! Vejam:

String conexao ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+@txtCaminho.Text+"; Persist Security Info=False;";String consultasql;
consultasql ="SELECT * from tblAnalises";

OleDbDataAdapter da =newOleDbDataAdapter(consultasql,conexao);

//Cria a dataTableDataTable dt =newDataTable();
da.Fill(dt);
dataGridView1.DataSource= dt;

da.Fill(oLHO_NA_LATADataSet2,"tblAnalises&quot;

oLHO_NA_LATADataSet2.AcceptChanges();
oLHO_NA_LATADataSet2.tblAnalises.AcceptChanges();


Alguém tem alguma sugestão para fazer funcionar o segundo código, ou alguma outra alternativa para fazer o mesmo serviço, com mais eficiência??? Tentei usar SQLBunkCopy, mas não consegui: parece que só funciona em SQL Server.

Agradeço desde já a atenção! Um abraço,
Gabriel.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal