Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-09-2004
Tecnic2 Tecnic2 is offline
Miembro
 
Registrado: may 2004
Posts: 155
Poder: 20
Tecnic2 Va por buen camino
Question 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.
Responder Con Cita
  #2  
Antiguo 16-09-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Tecnic2
...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.
¿Pq no usas ADOTAble para las tablas de Access? Justamente ADO es el driver de MS para BD de MS (aunque luego sirva para muchas otras).

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.
Responder Con Cita
  #3  
Antiguo 16-09-2004
Tecnic2 Tecnic2 is offline
Miembro
 
Registrado: may 2004
Posts: 155
Poder: 20
Tecnic2 Va por buen camino
Question 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.
Responder Con Cita
  #4  
Antiguo 16-09-2004
CHiCoLiTa CHiCoLiTa is offline
Miembro
 
Registrado: may 2003
Posts: 102
Poder: 21
CHiCoLiTa Va por buen camino
creo que se refiere a Field[0] en vez de FieldByName('fecfac'), que en ver por nombre, accedas por la posicion de campo
Responder Con Cita
  #5  
Antiguo 17-09-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por CHiCoLiTa
creo que se refiere a Field[0] en vez de FieldByName('fecfac'), que en ver por nombre, accedas por la posicion de campo
Correcto, a eso me refería. Gracias. Lo dije de memoria y ya se sabe, a veces juega malas pasadas...

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.
Responder Con Cita
  #6  
Antiguo 17-09-2004
Tecnic2 Tecnic2 is offline
Miembro
 
Registrado: may 2004
Posts: 155
Poder: 20
Tecnic2 Va por buen camino
Question 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;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:23:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi