Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gutomazzi

Lentidão em atualizar dados com OleDbCommand

Recommended Posts

Olá a todos. Estou com um problema de lentidão em atualizar um núemro grande de registro. exemplo se tenho 200 registro para atualizar ocorre um lentidão consideravél.

 

 

Segue o código abaixo

 

  Dim oConn As New OleDbConnection()
       Dim oCmd As OleDbCommand = oConn.CreateCommand()

       oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Mazzi;Extended Properties=dBASE IV;"

       If MsgBox("Deseja realmente Baixar o(s) orçamento(s)? ", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Excluir orçamento") = MsgBoxResult.Yes Then

           Dim prow As DataRow

           Dim datapag As Date

           datapag = Now.Date

           Dim i As Integer = 0

           For Each prow In Me.Ds_Orcamento.Tables("Orcamentos").Rows

               If DataGridView1.Rows(i).Cells(0).Value = True Then

                   oConn.Open()
                   oCmd.CommandText = "UPDATE VENDAPRA.DBF SET DATAPAG = '" + datapag + "' WHERE NVENDA=" + prow("NVENDA").ToString

                   oCmd.ExecuteNonQuery()
                   oConn.Close()

                   System.Windows.Forms.Application.DoEvents()

               End If

               i = i + 1

           Next

           MsgBox(i.ToString + " Orçamento(s) Biaxado(s) com Sucesso!", MsgBoxStyle.Information, "Baixa do Orçamento")

           Me.BdDataSet.Clear()
           Me.Ds_Orcamento.Clear()

           oConn.Dispose()
           oCmd.Dispose()

       End If

 

 

 

Como pode ser visto no código, tenho uma estrutura de repetição percorrendo os valores que serão atualizados. Como mencionei, com um grande número de registro (número de repetições da estrutura e execução do UPDATE) ocorre uma demora muito grande.

 

 

Agradeço pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Trabalhe com transação, pesquise na net que ira achar exemplos bem simples, desta forma irá abrir a conexão uma unica vez, ira comitar tudo de uma unica vez e fechar a conexão somente no final, deve melhorar muito a performance.

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe uma modalidade de update que usa um select como fonte de valore, eu sei que funciona no sql server...

 

é mais assim

 

update tabela01
set
campo1 = tabela02.cp1,
campo2 = tabela02.cp2,
campo3 = tabela02.cp3,
campo4 = tabela02.cp4
from 
tabela01 inner join tabela02 on tabela01.campo =  tabela02.campo

 

 

neste caso tabela01 é atualizada e tabela02 faz o papel deste dataset..

 

ele evita esse tipo de problema de ter que fazer uma série de looping's..

 

tá usando Access ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Trabalhe com transação, pesquise na net que ira achar exemplos bem simples, desta forma irá abrir a conexão uma unica vez, ira comitar tudo de uma unica vez e fechar a conexão somente no final, deve melhorar muito a performance.

 

Abraços...

 

 

Agradeço pela ajuda, mas com transação não está funcionando. Acredito que seja devido ao banco ser DBF (antigo Clipper), pesquisei na net e aplicai no sistema e continua lento. O que percebi foi que a linha oCmd.ExecuteNonQuery() é executada e efetivada antes do tran.Commit() e que o tran.Rollback() foi acionado somente quando ocorreu um erro de sintaxe do comando update por tipos diferentes nos campos

 

Fiz um teste com 700 registro e a lentidão é a mesma. Estou usando um i3 e consumiu nessa operação 25% da CPU.

 

Existe uma modalidade de update que usa um select como fonte de valore, eu sei que funciona no sql server...

 

é mais assim

 

update tabela01
set
campo1 = tabela02.cp1,
campo2 = tabela02.cp2,
campo3 = tabela02.cp3,
campo4 = tabela02.cp4
from 
tabela01 inner join tabela02 on tabela01.campo =  tabela02.campo

 

 

neste caso tabela01 é atualizada e tabela02 faz o papel deste dataset..

 

ele evita esse tipo de problema de ter que fazer uma série de looping's..

 

tá usando Access ???

 

 

Olá Daniel, não entendi muito vem esse procedimento. Você poderia colocar um exemplo ou link ou como devo buscar na net exemplos dessas instrução. Estou utilizando um "banco" legado utilizado no Clipper, os conhecidos DBF. Tentei utilizar transação conforme o colega sugeriu, mas não funcionou, minha esperança é essa instrução SQL.

 

 

Agradeço e aguardo

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.