Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Crear base de datos y cargar datos desde delphi (https://www.clubdelphi.com/foros/showthread.php?t=43432)

Albano 11-05-2007 01:04:33

Crear base de datos y cargar datos desde delphi
 
Hola de nuevo!
Uso Delphi 2005 y MySQL 5.0.41.
Quiero crear una base de datos y cargarle datos mediante ficheros .txt desde mi aplicación. Esto lo se hacer desde la linea de comandos de MySQL con las siguientes instrucciones:
Crear base de datos con sus tablas:
Código SQL [-]
CREATE DATABASE IF NOT EXISTS tabada;
USE tabada;
CREATE TABLE departamento (numero int(10), nombre varchar(45));
CREATE TABLE empleados (salario float, puesto varchar(45), nombre varchar(45),  apellido varchar(45), depto int(10), fecha_nac date, numero int(10), direccion varchar(100));
CREATE TABLE proyecto (numero int(10), nombre varchar(45), descripcion varchar(100), fecha_ini date, fecha_fin date);
CREATE TABLE trabajos (num_emp int(10), num_pro int(11));
Cargarle los datos:
Código SQL [-]
LOAD DATA LOCAL INFILE 'c:/tabada/empleados.txt' INTO TABLE empleados;
¿Cómo podría hacerlo desde una aplicación?
Tenía una idea, pero no me esta funcionando:
Puse un TADOQuery y le puse en su propiedad SQL el primer código SQL que puse aqui y me marcó error en el "USE", entonces lo que pensé es en crear con un TADOQuery la base de datos y luego cambiarle la base de datos a mi TADOConnection y luego poner la otra parte del procedimiento, para crear las tablas sobre mi nueva base de datos, pero ahi me marca el siguiente error:
Cita:

ADOQuery2: CommandText does not return a result set.
Creo que no se puede hacer mediante TADOQuery. Como se puede hacer?
Gracias de antemano.
Me conecto mediante TADOConnection.

delphi.com.ar 11-05-2007 03:00:36

Si lo puedes hacer, pero tienes que tener en cuenta un par de cosas. La primera es que ejecutrás código SQL DDL que no retorna datos, y como segundo tienes que tener en cuenta que debes ir ejecutando de a partes el script, línea por línea, buscando el caracter de fin de línea: ";". Existe un componente en las RxLibs para ese fin (No recuerdo si se llama RxDBScript o similar).
Mañana puedo subirte un fragmento de código que tengo donde hago algo muy similar.

Saludos!

Albano 11-05-2007 03:07:12

Gracias Federico, esperaré el código.

delphi.com.ar 11-05-2007 16:49:20

Antes que nada un par de comentarios, por como veo el código evidentemente lo "tomé prestado" del componente de las RxLibs. Lo otro que quiero que sepas, es que hace este código: Se trata de una aplicación que crea paquetes "autoejecutables" donde estos paquetes pueden ser scripts, querys, ejecutables, archivos, fuentes.... Este procedimiento es el asociado a un TADOConnection y te lo recorté un poco para que solo quede lo que necesitas:

Código Delphi [-]
var
  ADOConn: TADOConnection;
  AScript: TStringList;
begin
  ADOConn := TADOConnection.Create(nil);
  try
    with ADOConn do
    begin
      ConnectionString := '.........';
      Open;
      ExecuteScript(AScript, ADOConn, 'GO');
      Close;
    end;
  finally
    ADOConn.Free;
  end;
end


Código Delphi [-]
procedure ExecuteScript(SQL: TStrings; AADOConn: TADOConnection; ASeparator: string);
var
  iRecAffected: Integer;
  StatementNo: Integer;
  S, LastStr, L, T: string;
  SQLFilled: Boolean;
  I, CurrStatement,
  iCol: Integer;
  AQuerySQL: TStringList;
const
  QUERY_FIELD_SEPARATOR = ' ';
begin
  LastStr := '';
  AQuerySQL := TStringList.Create;
  try
    I := 0;
    StatementNo := -1;
    CurrStatement := 0;
    while I < SQL.Count do
    begin
      AQuerySQL.BeginUpdate;
      try
        AQuerySQL.Clear;
        SQLFilled := False;
        repeat
          if LastStr <> '' then
          begin
            AQuerySQL.Add(LastStr);
            LastStr := '';
          end;
          if I < SQL.Count then
          begin
            S := (SQL[i]);
            Inc(I);
            if CompareText(Trim(S), ASeparator) = 0 then
              SQLFilled := True
            else if S <> '' then
              AQuerySQL.Add(S);
          end
          else SQLFilled := True;
        until SQLFilled;
      finally
        AQuerySQL.EndUpdate;
      end;

      if AQuerySQL.Count > 0 then
      begin
        if (StatementNo < 0) or (StatementNo = CurrStatement) then
        begin
          AADOConn.Execute(AQuerySQL.Text, iRecAffected);
          if StatementNo = CurrStatement then Break;
        end;
        Inc(CurrStatement);
      end;
    end;
  finally
    AQuerySQL.Free;
  end;
end;

Saludos!

Albano 17-05-2007 20:01:18

Estoy trabajando en un proyecto urgente, pero no creas que se me ha pasado ver esto que me dices... Muchas gracias por el tiempo que le has dedicado, en unos dias lo voy a checar y te digo cómo me fue.


La franja horaria es GMT +2. Ahora son las 03:19:37.

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