Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/03/2011, 10:39
cesarprt
 
Fecha de Ingreso: enero-2008
Ubicación: León
Mensajes: 10
Antigüedad: 16 años, 2 meses
Puntos: 0
Consulta masiva muy lenta en vb.net con sql express

Hola, tengo que importar un archivo txt que contiene 400.000 lineas a una base de datos sql, el metodo de importación es el siguiente:

Leo una linea del txt, divido la cadena en campos y con el campo "codigo" ejecuto una consulta de busqueda, si existe el registro compruebo los posibles cambios y si no existe el registro lo añado a la bd.

El proceso ya le tengo hecho pero es demasiado lento, he comprobado que si no ejecuto la consulta el txt lo lee completo en 96 segundos, pero si activo la consulta a la db se dispara el tiempo a más de 10 horas.

Aquí pongo una pequeña parte del código a ver si podeis echarme una mano, pues ando un poco perdido.

Código:
Do

            strArti = objArticulos.ReadLine()
            artNombreFabricante = Microsoft.VisualBasic.Left(strArti, 14)
            artCodigoFabricante = Microsoft.VisualBasic.Mid(strArti, 15, 4)
            artCodigoBarras = Microsoft.VisualBasic.Mid(strArti, 19, 10)
            artDescripcion = Microsoft.VisualBasic.Mid(strArti, 29, 40)
            artCodigo = Microsoft.VisualBasic.Mid(strArti, 69, 18)
            artEan1 = Microsoft.VisualBasic.Mid(strArti, 87, 13)
            If artCodigo<>"" then
                If Microsoft.VisualBasic.Mid(strArti, 100, 11) IsNot Nothing Then
                    artPrecio = CDbl(Microsoft.VisualBasic.Mid(strArti, 100, 11))
                End If
                If Microsoft.VisualBasic.Mid(strArti, 111, 11) IsNot Nothing Then
                    artReciclaje = CDbl(Microsoft.VisualBasic.Mid(strArti, 111, 11))
                End If
                If Microsoft.VisualBasic.Mid(strArti, 122, 11) IsNot Nothing Then
                    artUnidades = CDbl(Microsoft.VisualBasic.Mid(strArti, 122, 11))
                End If
                If artUnidades <> 0 Then
                    artPrecio = artPrecio / artUnidades
                End If
                artPrecio1 = artPrecio / artCoef1
                ArtPrecio2 = artPrecio / artCoef2
                artTable = ArticulosTableAdapter.GetDataBy(Trim(artCodigo), Trim(artCodigoFabricante))
                frase = ""
                If artTable.Rows.Count = 0 Then
                    nNuevos = nNuevos + 1
                    ' articulo nuevo lo damos de alta
                    Dim nuevoArticulo As ActiveDataSet.ArticulosRow
                    nuevoArticulo = ActiveDataSet.Articulos.NewArticulosRow()
                    nuevoArticulo.nombrefabricante = artNombreFabricante
                    nuevoArticulo.fabricante = artCodigoFabricante
                    nuevoArticulo.barras = artCodigoBarras
                    nuevoArticulo.descripcion = artDescripcion
                    nuevoArticulo.codigo = artCodigo
                    nuevoArticulo.ean1 = artEan1
                    nuevoArticulo.precio = artPrecio
                    nuevoArticulo.precio1 = artPrecio1
                    nuevoArticulo.precio2 = ArtPrecio2
                    nuevoArticulo.reciclaje = artReciclaje

                    Me.ActiveDataSet.Articulos.Rows.Add(nuevoArticulo)
                    Me.ArticulosTableAdapter.Update(Me.ActiveDataSet.Articulos)
                    ' informamos
                    Fabricantes.Text = Fabricantes.Text & "Añadido: " & artCodigo & " - " & artDescripcion & vbCrLf
                Else
                    If artTable.Rows(0)("precio") <> artPrecio Then
                        artTable.Rows(0)("precio") = artPrecio
                        artTable.Rows(0)("precio1") = artPrecio1
                        artTable.Rows(0)("precio2") = ArtPrecio2
                        frase = frase & " - Precios (0): " & artPrecio & " (1): " & artPrecio1 & " (2): " & ArtPrecio2
                        artcambios = True
                    End If
                    If artTable.Rows(0)("reciclaje") <> artReciclaje Then
                        artTable.Rows(0)("reciclaje") = artReciclaje
                        frase = frase & " - Reciclaje: " & artReciclaje
                        artcambios = True
                    End If
                    If artcambios = True Then
                        'guardamos los cambios del articulo
                        nModificados = nModificados + 1
                        Me.Articulos.EndEdit()
                        Me.ArticulosTableAdapter.Update(Me.ActiveDataSet.Articulos)
                    End If
                    Fabricantes.Text = Fabricantes.Text & "Articulo " & artCodigo & " modificado: " & vbCrLf
                End If
            End If

            Contador.Text = linea
            Application.DoEvents()
            linea = linea + 1


        Loop Until strArti Is Nothing
Gracias de antemano a todas las posibles sugerencias y ayuda.
Un saludo.