Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Copiar Tablas (https://www.clubdelphi.com/foros/showthread.php?t=70641)

Mystery 02-11-2010 23:20:00

Copiar Tablas
 
Hola ha todos bueno yo estaba tratando de copiar unas tablas de una bd en access a otra SQL Server pero como son mas de 1000 000 de registros.
he tratado de hacer lo siguiente pero me da error... si alguien me pudiese decir lo que ocurre estaria agradecido...
Código Delphi [-]
arr:=VarArrayCreate([0, TbOrigen.FieldCount-1], varVariant);
while not TbOrigen.Eof do begin
    for i:=0 to TbOrigen.FieldCount-1 do
      arr[i]:=TbOrigen.Fields[i].VALUE;
    Tb_Destino.AppendRecord(arr);
    TbOrigen.Next;
  end;
sin mas

Mystery

Al González 03-11-2010 00:28:51

El código que usas puede ser algo lento con miles de registros, pero quizá te baste con resolver el error que dices.

La pregunta de los 64 mil gatitos resucitados: ¿qué mensaje de error exacto te aparece y en qué parte del código se detiene el programa cuando ese error ocurre?

Consejo: Cuando te aparezca una ventana de error en Delphi puedes presionar Ctrl+C (copiar) para llevar el texto del error al portapapeles y luego pegarlo aquí fácilmente. Copiar y pegar, vaya, sin necesidad de seleccionar el texto de la ventana de error. ;)

Por otra parte, considera que estás poniendo en memoria más de un millón de registros, y eso es mucho trabajo para cualquier componente de datos. Si el error es por falta de memoria, puede que hacer la operación por bloques (de manera que nunca haya más de unos cientos de registros en memoria) o emitiendo sentencias SQL Insert Into directas al servidor sean buenas alternativas.

Un abrazo de proporciones bíblicas.

Al González. :)

Mystery 03-11-2010 15:24:03

Hola Al bueno primeramente creo que debo una disculpa por el mensaje tan tétrico que he enviado...
Primeramente explicare que es lo que deseo hacer…
Bueno necesito realizar una aplicación que copie la estructura y los datos de una base de datos Access (Cualquiera que especifique el usuario) a un Servidor SQL Server que yo le especifique.
Ahora bien se que existen herramientas en SQL Server que me permiten copiar datos a gran velocidad como los DTS… pero no me sirven pues la BD Access es variable por así decirlo.
Entonces no he hallado otra manera que la especificada
Código Delphi [-]
  Var
     Arr:Variant;
  begin
     arr:=VarArrayCreate([0, TbOrigen.FieldCount-1], varVariant);
    while not TbOrigen.Eof do begin
      for i:=0 to TbOrigen.FieldCount-1 do
        arr[i]:= TbOrigen.Fields[i].VALUE;
      Tb_Destino.AppendRecord([arr]);
      TbOrigen.Next;
    end;
  end;
El error que me envia es el siguiente
“Could not convert variant of type (Array Variant) into type (String).”
Ahora si en el AppendRecord lo pongo asi…
Código Delphi [-]
  Tb_Destino.AppendRecord(arr);
De todas formas Al como tu dices es muy lento pues yo lo hacia asi…
Código Delphi [-]
    while not Tb_Origen.Eof do begin
      for i:=0 to Tb_Origen.FieldCount-1 do
        Tb_Destino.Fields[i].AsString:= Tb_Origen.Fields[i].AsString;
      try
        Tb_Destino.Post;
      except
        Tb_Destino.Cancel;
      end;
      Tb_Origen.Next;
    end;
y realmente en tablas con mas de 100 000 registros se demoraba bastante. Entonces me dijeron que de la primera forma es mas rápido pero no he dado en como hacerlo.
Entonces si alguien conoce algún método distinto a este pero que sea mas optimo que no dude en publicarlo…
Mil gracias de antemano sin más
Mystery


La franja horaria es GMT +2. Ahora son las 00:01:54.

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