Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Como puedo importar un csv a MYSQL (https://www.clubdelphi.com/foros/showthread.php?t=69195)

Alvarus 01-08-2010 05:02:40

Como puedo importar un csv a MYSQL
 
Hola,
Estoy intentando importar un archivo csv a MYSQL desde Delphi, para esto estoy utilizando el objeto SqlQuery.
Cuando trato de llamar a mi query desde un botón me indica que tengo cinco errores:
Checking project dependencies...
Compiling Project1_ABCMysql.dproj (Debug configuration)
[DCC Error] ejemplo.pas(98): E2066 Missing operator or semicolon
[DCC Error] ejemplo.pas(98): E2029 'END' expected but string constant found
[DCC Error] ejemplo.pas(98): E2038 Illegal character in input file: '"' (#$22)
[DCC Error] ejemplo.pas(98): E2038 Illegal character in input file: '\' (#$5C)
[DCC Fatal Error] Project1_ABCMysql.dpr(5): F2063 Could not compile used unit 'ejemplo.pas'

El código es el siguiente:

Código Delphi [-]
ClientDataSet1.Close;
SQLDataset1.Close;

SqlQuery1.Close;
SqlQuery1.SQL.Clear;
SqlQuery1.SQL.Text:='LOAD DATA INFILE 'c:\\archivo.csv' INTO TABLE test.pruebas FIELDS TERMINATED BY ',' ENCLOSED BY '"'LINES TERMINATED BY '\n'ignore 1 lines;';
SqlQuery1.Active:=True

La instrucción SQL esta bien, puesto que ya lo he ejecutado en la BD.
Los errores hacen referencia a la instrucción:
SqlQuery1.SQL.Text:='LOAD DATA INFILE 'c:\\irnet.csv' INTO TABLE test.irnet FIELDS TERMINATED BY ',' ENCLOSED BY '"'LINES TERMINATED BY '\n'ignore 1 lines;';

:confused:
Muchas gracias por cualquier ayuda y/o sugerencia

Estoy utilizando RAD Studio 2010.
Alvaro

roman 01-08-2010 05:20:28

Hola Alvarus, bienvenido al Club.

He puesto etiquetas [delphi] a tu mensaje para que quede mejor el formato. Así puedes ver más claramente que estás formando mal la cadena de texto de la instrucción SQL: debería aparecer todo en color naranja.

// Saludos

Alvarus 01-08-2010 05:29:00

Roman,
Gracias por el dato, pero lo que no se, es como Delphi maneja la instrucción del archivo que quiero subir, es decir 'c:\\archivo.csv', :confused: o como puedo pasarle ese parámetro al Query para que lo ejecute.

Gracias.

Alvaro

Alvarus 01-08-2010 07:24:07

Ya pude solucionar el problema de la cadena que hace referencia al archivo, esta debería quedar así:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet1.Close;
SQLDataset1.Close;

SqlQuery1.Close;
SqlQuery1.SQL.Clear;
SqlQuery1.SQL.Text:='LOAD DATA INFILE ''c:irnet.csv'' INTO TABLE test.irnet FIELDS TERMINATED BY '','' ENCLOSED BY ''"''LINES TERMINATED BY ''\n''ignore 1 lines;';
//SqlQuery1.SQL.Text:='LOAD DATA INFILE "c:\\irnet.csv" INTO TABLE test.irnet FIELDS TERMINATED BY "," ENCLOSED BY """LINES TERMINATED BY "\n" ignore 1 lines;';
SqlQuery1.Active:=True

end;

Sin embargo, cuando se ejecuta la aplicación, tengo el siguiente mensaje de error:
Raised exception class EDatabaseError with message 'SQLQUERY1: cursor not returned from Query';
SQLQuery1: Cursor not returned from Query

:confused:

Agradeceré cualquier ayuda y/o sugerencia.
Gracias.
Alvarus

roman 01-08-2010 18:40:19

En lugar de poner

Código Delphi [-]
SqlQuery1.Active:=True

debes poner

Código Delphi [-]
SqlQuery1.ExecSQL;

Esto es así porque la consulta que estás usando (LOAD DATA...) no devuelve un cursor, esto es, un conjunto de registros.

// Saludos

Alvarus 02-08-2010 03:37:28

Solucionado !!!
 
Hola,
El problema lo solucione cambiando lo siguiente en mi código:

Código Delphi [-]
SqlQuery1.SQL.Text:='LOAD DATA INFILE ''c:file.csv'' INTO TABLE test.table FIELDS TERMINATED BY '','' ENCLOSED BY ''"''LINES TERMINATED BY ''\n''ignore 1 lines;';
SqlQuery1.Active:=True;




Estas líneas fueron cambiadas por:

Código Delphi [-]
SQLQuery1.SQL.Add('LOAD DATA INFILE ''c:file.csv'' INTO TABLE test.table FIELDS TERMINATED BY '','' ENCLOSED BY ''"''LINES TERMINATED BY ''\n''ignore 1 lines;');
   SQLQuery1.ExecSQL(true);




Para aquel que necesite un ejemplo del código final es este:

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    ClientDataSet1.Close;
    SQLDataSet1.Close;
    SQLQuery1.SQL.Clear;
    SQLQuery1.SQL.Add('LOAD DATA INFILE ''c:irnet.csv'' INTO TABLE test.irnet FIELDS TERMINATED BY '','' ENCLOSED BY ''"''LINES TERMINATED BY ''\n''ignore 1 lines;');
    SQLQuery1.ExecSQL(true);
    SQLDataSet1.Open;
    ClientDataSet1.Open;
 end;

Claro quedaría mucho mejor si pudiera enviar un mensaje que le muestre al usuario cuantos registros subió con el archivo, pero bueno supongo que son detalles que ya ire encontrando en Delphi 2010.
Saludos
Alvarus :D

alej.villa 21-06-2011 17:13:33

estoy tratando de hacer algo igual pero no se mucho de SQL podrias explicar un poco la linea de SQL para entenderla mejor y gracias!

Alvarus 22-06-2011 04:45:37

Hola Alej,
Te explico lo que hice:
Load data infile = le indico al programa de que archivo debe subir la informacion.
Into table = indico en que base de datos y en que tabla voy a guardar los datos, recuerda la base_de_datos.tabla
FIELDS TERMINATED BY '','' = Aca indico que los campos estan separados por comas en el archivo csv.
ENCLOSED BY ''"''= se indica que los campos estan entre comillas.
LINES TERMINATED BY ''\n'' = indico el salto de lineas, es decir comienza un nuevo registro en el archivo csv.
ignore 1 lines;' = Indico que ignore la primera linea, por lo general estan los nombres de los campos.
Para mayor información te recomiendo ver la documentación de MYSQL.
Saludos
Alvarus

alej.villa 22-06-2011 13:37:22

Gracias por la respuesta, ahora bien si mi archivo no tiene comas, ni comillas como puedo aplicar tu codigo?
mi archivo esta en excel y por ende no trae campos que terminen con ',' ni encerrados en ""
aun asi necesito importarlo a una base de datos en MS SQL Server utilizando como intermediario el lenguaje de programacion Delphi 7.

Podrias ayudarme o si sabes de algun manual, pagina web para orientarme te lo agradeceria mucho.!

roman 22-06-2011 16:07:08

Cita:

Empezado por alej.villa (Mensaje 404479)
aun asi necesito importarlo a una base de datos en MS SQL Server utilizando como intermediario el lenguaje de programacion Delphi 7.

Si te fijas, el título de este tema es: "Como puedo importar un csv a MYSQL y las respuestas aluden a una instrucción específica de MySQL. Habría que ver si MS SQL Server tiene una instrucción similar.

// Saludos


La franja horaria es GMT +2. Ahora son las 02:11:18.

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