FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Algun consejo para copiar datos?
Hola, estoy haciendo una aplicacion que tiene que coger tablas .dbf y copiar todos sus registros en tablas .mdb.
Obtengo los datos de las tablas .dbf con un TADOQuery y las .mdb con un TTable. Pues bien, el principal problema es que el total de registros a copiar es de 400.000 aproximadamente, y tarda más de 30 minutos en completar el traspaso. Lo que quiero es saber si hay alguna otra forma de hacerlo para ir más rápido a parte de la que yo utilizo. Ésta es la funcion para copiar una de las tablas: procedure TFAssistent.VolcarAlbfaccp(); begin ADOQueryAux.Close; ADOQueryAux.SQL.Clear; ADOQueryAux.SQL.Add('SELECT fecfac, codpro, ejefac, numfac'); ADOQueryAux.SQL.Add('FROM albfaccp'); ADOQueryAux.Open; while (n_regs <= ADOQueryAux.RecordCount -1) do begin inc(n_regs); lInfo2.Caption := 'Registro: ' + IntToStr(n_regs) + ' de ' + FloatToStr(ADOQueryAux.RecordCount); BarraProgreso.Position := n_regs; TAccessDatos.Insert; TAccessDatos.FieldByName('fecfac').AsString := ADOQueryAux.Recordset.Fields.Item[0].Value; TAccessDatos.FieldByName('codpro').AsString := ADOQueryAux.Recordset.Fields.Item[1].Value; TAccessDatos.FieldByName('ejefac').AsString := ADOQueryAux.Recordset.Fields.Item[2].Value; TAccessDatos.FieldByName('numfac').AsString := ADOQueryAux.Recordset.Fields.Item[3].Value; TAccessDatos.Post; ADOQueryAux.Recordset.MoveNext; end; end; Muchas gracias. |
#2
|
||||
|
||||
Cita:
Desactiva controles visuales "ligados" a los Datasets (si es que tienes alguno). Podrías probar a crear los índices en la tabla destino al acabar (si no son necesarios para comprobaciones), eso aceleraría las inserciones. FieldByName tardará más que FieldByIndex; Como no va a cambiar el orden, mira cual es ese el orden y accede a los campos por índice. Ya se que el tema de la barra de progreso y el label es necesario, pero intenta que el refresco no sea cada registro, sino cada 500 registros (por ejemplo), al usuario le sigue dando info. y tú te evitas muchos refrescos. ADOQueryAux.RecordCount es un valor fijo, sácalo del bucle a una variable y no lo calcules cada vez (tanto el de la línea del while, como el que hay dentro). Si puedes hacer éstos cambios, a ver si baja bastante... (infórmanos )
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
|||
|
|||
Pregunta
Ya he probado lo del RecordCount y he reducido 10 minutos. Ahora estoy probando poner el TADOTable pero no veo la propiedad "FieldByIndex". Es que no la he buscado bien?
Gracias. |
#4
|
|||
|
|||
creo que se refiere a Field[0] en vez de FieldByName('fecfac'), que en ver por nombre, accedas por la posicion de campo
|
#5
|
||||
|
||||
Cita:
El tema de los controles visuales (no refrescar cada registro, sino cada 500, por ejempo) creo que también te hará bajar bastante; junto con los índices en la tabla destino (si es posible). Una última cosa que se me ocurre (aunque no se si bajará mucho el tiempo) es utilizar un ADOQuery/ADOCommand para insertar en lugar de un ADOTable; En ese caso se puede "jugar" con las propiedades Prepared(False), ExecuteOptions(eoExecuteNoRecords), CursorType(ctOpenForwardOnly),... y tal vez alguna más... Lo dicho, sigue informándonos de los resultados, ya que es tema que interesa.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#6
|
|||
|
|||
Problemas con ADO, URGENTE!
Tengo la siguiente funcion para abrir la conexion ADO de enlace con las tablas access destino, pero me da error. PORQUE!!!
procedure TFAssistent.ObreADO(); begin ADOConnexioAccess.ConnectionString := 'Provider=MSDASQL.1;' + 'Persist Security Info=False;' + 'Extended Properties="DSN=WingestControl;' + 'DBQ=C:\Dades\WingestControl\ANCORA\dades.mdb;' + 'DriverId=25;' + 'FIL=MS Access;' + 'MaxBufferSize=2048;' + 'PageTimeout=5;' + 'UID=admin;"'; ADOConnexioAccess.Connected := True; ADOTAccessDades.Active := True; end; |
|
|
|