Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Importar datos a una base de datos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Importar datos a una base de datos Responder citando

Hola:
Mi pregunta es la siguiente. ¿Alguien conoce algún buen método/algoritmo para importar datos desde una archivo de texto plano a una base de datos Interbase? Los campos de los registros en el archivo plano son de ancho fijo, es decir, no están delimitados por ningún caracter.
El mejor método que encontré es usar el componente TIBSQL. Lo que hago es crear un consulta de tipo "INSERT INTO..." e ir modificando en la misma el valor que va dentro de "VALUES(...)". Para eso voy recorriendo el archivo plano y guardando cada registro en un AnsiString. Después con el método SubString del AnsiString voy sacando el valor de los distintos campos y con eso voy formando la consulta. Después, por cada registro llamo al método ExecSQL del TIBSQL. Cuando termino de recorrer todo el archivo salgo del bucle y efectúo un Commit para que se guarden todos los datos en la BD.
El tema es que esto es demasiado lento. El número de campos es 21 por registro y para que se den una idea, para ingresar 3700 registros tardo 7 segundos. Tiene que haber algo mejor, debido a que usando el método BatchInput del TIBSQL el mismo trabajo lo hace en dos segundos. Lo que Uds. se preguntarán es por qué no uso este método. En primer lugar este método sirve para cuando el archivo origen está delimitado por algún caracter (por ejemplo la coma). En segundo lugar porque de acuerdo al valor que voy rescatando de los distintos campos, voy haciendo un prefiltro de acuerdo a ciertos criterios, de tal manera que no todos los registros del archivo se importan a la BD. Usando el método BatchInput esto no es posible porque imnporta todos los registros.

Bueno, si alguien me puede dar una mano se lo voy a agraceder.

Saludos.
Warlock.
Volver arriba
Mensaje    Asunto: Responder citando

HOLA:

A simple vista, yo hubiese hecho lo mismo, a no ser que puedas editar directamente, el archivo de texto de donde importas, borrar los datos que no te interesen y hacer las marcas de fin de registro, creo que tratar antes el fichero de importacion seria mas rapido, una vez lo tengas tratado puedes probar ha hacer un gback, o un restore desde el ibconsole.

Si no, pon un progressbar, y un bonito mensaje de espere por favor...

By.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Toño:
Primero una pregunta. Qué es un gback? Segundo, los datos los tengo que importar a la base mediante la aplicación que estoy desarrollando, no lo puedo hacer desde el ibConsole porque es una cosa que voy a tener que hacer para una posterior búsqueda de registros. Por último, estuve importando los registros enteros mediante el método BatchInput del TIBSql y tarda lo mismo que ejecutando la consulta INSERT registro por registro.
Volver arriba
Mensaje    Asunto: Responder citando

HOLA:

1º GFIX en su modo backup "GFIX BACKUP =GBACK", Perdon por la incorreccion, si no conoces la herramienta gfix, sera mejor que la heches un vistazo, seguramente la utilizaras en el futuro.

2º Depende del volumen de datos a importar, nunca me he visto en la situacion de importar una gran cantidad de datos, pero podrias probar registro a registro, con Cachedupdate = true, (ApplyUpdates para salvar los datos), y miras a ver.

De todas formas voy ha buscar en la red a ver si encuentro algo que te pueda servir.

¿ Importas de Interbase ->Fichero texto ->Interbase ?

si es asi podrias probar
Interbase ->Paradox ->Interbase.

By.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Toño:
Ante todo muchas gracias. La herramienta GFIX no la conozco, no sé de qué se trata. ¿Es un administrador de base de datos, o algo por el estilo?
También intenté ingresar los registros con CacheUpdate, pero tarda lo mismo. Igualmente, cuando vos decís ingresar registro a registro ¿te referís a ir ejecutando una consulta tipo "INSERT INTO..." por cada registro, no?
Otra cosa, ¿existe la posibilidad que usando el DBE (los controles TTable, TQuery) para un volumen de datos más chico la importación a la base de datos sea más rápida que usando InterBase? ¿Cuándo usas una base de datos de tipo escritorio (como Paradox, Access, DBase), cuál de todas ellas conviene usar?
Bueno Toño, disculpá mi ignorancia, pero recién entoy empezando a programa con Buider, siempre lo hice en Visual Basic. Esta aplicación que estoy haciendo ya la hice en VB, pero no puedo creer que pueda importar los mismos datos en una base de datos Access usando Microsoft Jet en Visual Basic que hacer lo mismo en Builder utilizando un Administrador de Base de datos. ¿Voy a tener acaso que instalarme un tremendo Oracle para una aplicación relativamente chica???? Tené en cuenta que la cantidad de registros promedio que importo cada vez que uso la aplicación es de 5000 (tampoco es tanto como para que sea tan lento). Igual, estoy seguro que tiene que haber un método más rápido porque si vas al Access y ponés importar el mismo trabajo lo hace diez veces más rápido. Lo que pasa que ése es un algoritmo interno de Microsoft.

Bueno, un abrazo y mil gracias.

Warlock.
Volver arriba
Mensaje    Asunto: Responder citando

Hola Warlock

Podes importar/exportar archivos txt de estructura fija a/desde interbase o firebird desde el propio motor de la siguiente forma:

Importar:
Hay que crear una tabla en IB
create table Prueba external file 'C:\archivo.txt'(
campo1 char(50),
campo2 char(30),
...
campon char(10),
retorno char(2) /*Esto es para windows o bien retorno char(1) para Unix o Linux*/

Entonces desde la base con cualquier herramienta o programa la ves a la tabla Prueba como una tabla mas de la base, podes hacer select e insert, no update o delete, solo que reside en un archivo externo, despues creas una nueva tabla con la misma extructura y moves los datos de Prueba a la nueva tabla, por ultimo haces drop table Prueba.

Para exportar es similar, solo que si no existe el archivo externo lo crea.

Es probable que me este olvidando de algo. Ahora estoy de vacaciones, pero la semana que viene te puedo mandar todo de forma mas calra si no te funciona este ejemplo.

Saludos
TJOSE
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

HOLA:

Bueno muchas preguntas, interbase se intala con un paquete de programas en ms-dos, entre ellos esta gfix, la mayor utilidad que tiene es cambiar la sincronia de los registros, repara una base de datos dañada, etc.

Lo mas rapido es utilizar los componentes nativos de interbase
TIBi..., ten encuenta que la utilizarlos no pasas por el dbe, y te ahorras una capa.

La opcion de TJOSE puede valerte, asocias una tabla externa a la base de datos, pero luego puedes hacer lo sig.

create table Prueba external file 'C:\archivo.txt'(
campo1 char(50),
campo2 char(30),
********


insert into MiTabla (Codigo,Nombre)
select campo1, campo2 from Prueba // [where] opcional


La velocidad tendra que ser de segundos.

By.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.