Foros del Web » Programación para mayores de 30 ;) » .NET »

OleDbCommand demasiado lento

Estas en el tema de OleDbCommand demasiado lento en el foro de .NET en Foros del Web. Hola, tengo una duda, como podria aumentar la velocidad-rendimiento de mis aplicasiones? pongo un ejemplo, trabajo con una base de datos access en red, por ...
  #1 (permalink)  
Antiguo 11/07/2008, 06:47
 
Fecha de Ingreso: agosto-2005
Mensajes: 33
Antigüedad: 18 años, 8 meses
Puntos: 0
OleDbCommand demasiado lento

Hola, tengo una duda, como podria aumentar la velocidad-rendimiento de mis aplicasiones?

pongo un ejemplo, trabajo con una base de datos access en red, por ejemplo unidad x: conectada por red (net use x: \\servidor\bd)

lleno un datagridview con una consulta a esa base de datos, y una vez lleno recorro cada linea, para actualizar otras tablas dentro de esa misma bd, un ejemplo:

Código:
For i As Integer = 0 To DGV1.Rows.Count - 2
ProgressBar1.Maximum = DGV1.Rows.Count - 2


            Dim Q_update As String = _
          "UPDATE Articulos SET Articulos.nIdIvaV = " & DGV1.Rows(i).Cells(11).Value & ", " & _
          "WHERE (((Articulos.nId)=" & DGV1.Rows(i).Cells(0).Value & "));"

            Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=X:\BASE.MDB;User Id=admin;Password=;")

            Dim com As New OleDbCommand
            com.Connection = conn

            conn.Open()
            com.CommandText = Q_update

            com.ExecuteNonQuery()
            conn.Close()

            ProgressBar1.Value = i

label.text= "articulo: " & i & " de: " & DGV1.Rows.Count - 2


        Next
Tarda demasiado en hacer el recorrido, el label1 es que nisiquiera se ve, solo hasta que termina todo. el progressbar si cambio de ventana y vuelvo al programa ya no se ve y la ventana queda bloqueada con el texto "no responde" aunque sigue trabajando

desde que empece a hacerme mis pequeñas aplicasiones para este tipo de cosas me sucede esto (por lo que dicho sea de paso soy algo novato) pero habia escapado, pero cada vez es mas insoportable y como cada vez hay mas datos o varios recorridos, para varias consultas, pues se puede pegar hasta 30 minutos

Alguna idea?. Gracias
  #2 (permalink)  
Antiguo 11/07/2008, 07:17
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: OleDbCommand demasiado lento

Usa un BackGroundWorker o un Thread. Revisa el tema es muy simple y dejara tu apicaicon funcional y reportando progreso.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #3 (permalink)  
Antiguo 11/07/2008, 11:47
 
Fecha de Ingreso: agosto-2005
Mensajes: 33
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: OleDbCommand demasiado lento

gracias por el consejo, estoy buscando informacion al respecto y no logro integrar el BackgroundWorker1 en mi aplicación, podrias, segun el codigo que envie antes, en que parte deberia poner este codigo que encontre:

Código:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
        If BackgroundWorker1.CancellationPending Then
            Exit Sub
        End If
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim i As Integer = 0
        For i = 0 To 100
            BackgroundWorker1.ReportProgress(i)
        Next
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        BackgroundWorker1.CancelAsync()
        Label1.Text = "Proceso cancelado"
        MsgBox(ProgressBar1.Value)
    End Sub


    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Label1.Text = "Proceso completado"
    End Sub
yo lo intente poniendo en el evento click de mi boton:

Código:
  BackgroundWorker1.RunWorkerAsync()
        If BackgroundWorker1.CancellationPending Then
            Exit Sub
        End If
y cambiando esto:

Código:
    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim i As Integer = 0
        For i = 0 To 100
            BackgroundWorker1.ReportProgress(i)
        Next
    End Sub
por esto:

Código:
    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim i As Integer = 0
        For i = 0 To dgv1.rows.count -2
            BackgroundWorker1.ReportProgress(i)
        Next
    End Sub
pero nada, sigue pasando lo mismo, que hace el trabajo pero sin mostrar el progressbar, y dejando de responder si se cambia de ventana o se intenta hacer click en el boton cancelar
  #4 (permalink)  
Antiguo 11/07/2008, 12:08
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: OleDbCommand demasiado lento

Es tu enfoque tu metodo q hace las actualizaciones seguramente tiene un loop

tu solo tienes q decile a tu BackGroundWorker q empiece cuando le des click o cualquier otro evento.

YO lo pondria asi

todo esto dentro del DoWork (ojo todo tu codigo debe ser invocado o estar ene ste metodo) lo q tarda mucho.

Código:
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim i As Integer = 0
        For i = 0 To dgv1.rows.count -2
            // Aqui pon todo tu codigo q hace el update
            BackgroundWorker1.ReportProgress(i)
        Next
    End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
        label.text= "articulo: " & i & " de: " & Total
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Label1.Text = "Proceso completado"
    End Sub
y los 2 eventos de worker completed y cancelado se quedna igual incluso el de progresschanged.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #5 (permalink)  
Antiguo 11/07/2008, 12:08
 
Fecha de Ingreso: agosto-2005
Mensajes: 33
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: OleDbCommand demasiado lento

ya me contesto yo solo pues ya me funciona y perfectamente como queria, mushisimas gracias. La solución o mejor dicho la manera de integrarlo en eun codigo parecido al mio es.

crear un private sub nuevo por ej.:

Código:
    Private Sub BakcWork()
        If Not Me.BackgroundWorker1.IsBusy Then

            With BackgroundWorker1
                .WorkerSupportsCancellation = True
                .RunWorkerAsync()
            End With
        End If
    End Sub
y en el boton_click llamas a ese sub y en el evento dowork del backgroundWorker1 llamas al private sub donde esta el codigo que quieres ejecutar en segundo plano (para qu eno se bloquee la ventana principal y reporte los cambios)

por ej.:

Código:
    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        
RecorreGrid()

    End Sub
Gracias, y espero le sirva a alguien mas mi problemilla
  #6 (permalink)  
Antiguo 11/07/2008, 12:10
 
Fecha de Ingreso: agosto-2005
Mensajes: 33
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: OleDbCommand demasiado lento

Peterpay, me ganaste a escribir ya me funciona, gracias por la ayuda :p
  #7 (permalink)  
Antiguo 11/07/2008, 12:12
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: OleDbCommand demasiado lento

Q bueno me dagusto
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:27.