Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-05-2012
papote654 papote654 is offline
Miembro
 
Registrado: nov 2006
Posts: 29
Poder: 0
papote654 Va por buen camino
Entiendo, utilizo ADOQuery. Este ejecura un commit cuando hace el ExecSQL, pero no tengo propiedades para desactivarlo.
__________________
Al que no le gusta enseñar, no merece aprender...
Responder Con Cita
  #2  
Antiguo 14-05-2012
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
Cita:
Empezado por papote654 Ver Mensaje
Entiendo, utilizo ADOQuery. Este ejecura un commit cuando hace el ExecSQL, pero no tengo propiedades para desactivarlo.
Para este caso solo haz lo de los GO, olvídate de la transacción, nos cuentas como te va en la prueba.

Saludos.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #3  
Antiguo 14-05-2012
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Yo te recomiendo que los commits lo hagas cada n inserciones, no después de cada una. Yo cuando he tenido que importar grandes cantidades de datos a una base de datos hago los commits cada 500 registros.


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #4  
Antiguo 14-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por maeyanes Ver Mensaje
Hola...
Yo te recomiendo que los commits lo hagas cada n inserciones, no después de cada una. Yo cuando he tenido que importar grandes cantidades de datos a una base de datos hago los commits cada 500 registros.
Saludos...
Por supuesto, hacerlo cada registro es una pérdida tremenda de tiempo.
Responder Con Cita
  #5  
Antiguo 15-05-2012
papote654 papote654 is offline
Miembro
 
Registrado: nov 2006
Posts: 29
Poder: 0
papote654 Va por buen camino
He realizado las pruebas con las recomendaciones que me han hecho pero la verdad, para mi sorpresa insertando todo de una vez es mas rapido que hacerlo por lotes. El codigo es este.

el archivo esta compuesto por datos como este.

esa primera parte hasta el simbolo > es la condicion para poder validar si el registro existe, hago esto al momento de exportar ya que se supone que esos valores talvez no existan en la tabla destino.

WHERE Se_codigo_pais = '187' AND Se_codigo_ciudad = '3323' AND Se_codigo = '5'>'5','3323','187','VILLA DUARTE'

Código Delphi [-]
Procedure Tfrm_configuracion.Importar;
Var
   F: TextFile;
   sLinea: String;
   sArchivo, DatosInsert, Tabla, varValidaExiste, Condicion: String;
   SR: TSearchRec;
Begin
   //ruta de los archivos
   sArchivo := varRutaArchivo;

   DatosInsert := '';
   varValidaExiste := '';

   //busca todos los archivos de la carpeta definida
   If FindFirst(sArchivo + '\*.txt', faArchive, SR) = 0 Then
      Begin
         //recorre los archivos de la carpeta
         Repeat

            //asigna el archivo
            AssignFile(F, sArchivo + '\' + SR.Name);

            //abro el archivo
            Reset(F);

            //captura el nombre real de la tabla
            Tabla := FtNombreTabla(copy(SR.Name, 18, 100));

            //busca los campos del servidor de destino
            Buscar_Campos(Tabla, servidor_destino);

            While Not Eof(F) Do
               Begin
                  //recorre los datos del archivo
                  ReadLn(F, sLinea);

                  Condicion := ftCondicion(sLinea);

                  //construyo el insert
                  varValidaExiste := 'IF EXISTS(SELECT 1 FROM ' + Tabla + ' ' + Condicion + ') DELETE FROM ' + Tabla + ' ' + Condicion;

                  DatosInsert := DatosInsert + varValidaExiste + ' INSERT INTO ' + Tabla + '(' + CamposOrdenados + ')' + ' VALUES(' + Copy(sLinea, PosicionesCondicion, Length(sLinea)) + ')';
               End;

            //inserta datos en la tabla de destino.
            Inserta_datos(DatosInsert);

            //cierra el archivo
            CloseFile(F);

            //muevo el archivo a otra carpeta de backup
            MoveFile(PChar(varRutaArchivo + '\' + SR.Name), PChar(varRutaBackup + '\' + SR.Name));

         Until FindNext(SR) <> 0; //cuando termine de recorrer los archivos de la carpeta

         //cierra el fichero de la carpeta donde estan los archivos
         FindClose(SR);
      End;
End;

Procedure Tfrm_configuracion.Inserta_datos(DatosInsert: String);
Var
   Qry: TADOQuery;
Begin
   Qry := TADOQuery.Create(Self);

   Qry.Connection := servidor_destino;

   With Qry, SQL Do
      Begin
         Close;
         Clear;
         Add(DatosInsert);
         ExecSQL;
      End;

   Qry.free;
End;
__________________
Al que no le gusta enseñar, no merece aprender...
Responder Con Cita
  #6  
Antiguo 15-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que ganarás más tiempo si usas parámetros en lugar de componer la sentencia, más o menos, algo parecido a este ejemplo:

Código Delphi [-]
dataset.close;
dataset.sql.text:='insert into tabla values :campo1, :campo2, campo3';
dataset.prepare;

while not eof(loquesea) do
begin
  dataset.paramsbyname('campo1').value := loquesea;
  dataset.paramsbyname('campo2').value := otroloquesea;
  dataset.paramsbyname('campo3').value := algoloquesea;
  dataset.execquery;
end;
dataset.transaction.commit;
Responder Con Cita
  #7  
Antiguo 16-05-2012
sinalocarlos sinalocarlos is offline
Miembro
 
Registrado: sep 2006
Posts: 152
Poder: 18
sinalocarlos Va por buen camino
Ademas de las recomendaciones que te han hecho, una forma de identificar problemas es revisando del lado del servidor de SQL que esta pasando, para ello esta el profiler, crea una traza con el template Standar y vigila que se esta mandando desde tu programa.

Te lo comento porque a mi me paso algo por el estilo, después de volver a escribir media librería me di cuenta de que no estaba limpiando la propiedad SQL, por que lo que en realidad estaba enviando un acumulado de inserts cada vez
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Insert múltiple (o masivo) santiago14 SQL 24 12-03-2011 13:19:31
Insert masivo en firebird santiago14 Firebird e Interbase 2 24-05-2010 02:50:29
Interbase cada vez más lento... AMINOA2R Firebird e Interbase 1 17-11-2005 17:47:00
Un Insert muy lento......... sitrico Conexión con bases de datos 9 30-05-2005 15:52:21


La franja horaria es GMT +2. Ahora son las 05:19:07.


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