Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Quiero correr un archivo .sql pero no logro hacer un create / insert (https://www.clubdelphi.com/foros/showthread.php?t=32917)

joal 21-06-2006 06:09:49

Quiero correr un archivo .sql pero no logro hacer un create / insert
 
Tengo un sistema que realiza consultas e inicializa una base de datos Firebird, todo ello gracias a que cargo un archivo con comandos sql (.sql) y los voy ejecutando 1 x 1.

Para los selects uso un IBTransaction (inactivo, apunta al IBDatabase), un IBDatabase (activo), un IBQuery (inactivo, apunta al IBDatabase y al IBTransaction) y un DataSource (activo, apunta a IBQuery) para acceder a una base de datos Firebird. Con este no tengo problemas para obtener la información (IBQuery.Active=true).

El problema es cuando quiero hacer un CREATE y posteriormente un INSERT sobre esa tabla.
Si IBTransaction esta inactiva, recibo un error (Transaction is not active) cuando quiero hacer un create (IBQuery.ExecSql) y no llega al INSERT. Si por el contrario, activo la IBTransaction y corro el programa, el error se presenta al hacer el INSERT, indicándome que no existe dicha tabla.

Igualmente probé sustituyendo el IBQuery con un IBSql (.ExecQuery) y tampoco logro ejecutar todos los comandos de mi archivo .sql.

Agradeceré me orienten acerca de que estoy haciendo mal.

gracias

waltergomez 21-06-2006 23:43:08

Si autocommit es true u on entonces no debrias tener problemas cuando la transaccion esta inactiva.

joal 22-06-2006 02:19:01

pues si esta activa, es lo curioso
 
Mejor incluyo el codigo, no vaya a ser que este haciendo una burrada de primaria (se vale montoneo, sirve que aprendo). :confused: Tengo un SQL por linea (algunas lineas las tengo como comentario, por lo que no las ejecuto), y siempre esta el CREATE previo al INSERT sobre dicha tabla.

Cita:

Código:

procedure Tfrm_inicializadorDB.bbtn_EjecutarClick(Sender: TObject);
var
  i: integer;
  str_query, str_table: string;
begin
  ibt_IBTransaction.StartTransaction;
  // Corro 1x1 los datos cargados previamente en un memo
  for i:= 0 to mem_Queries.Lines.Count do
    begin
    str_query:= Trim(mem_Queries.Lines.Strings[i]);
    if (Length(str_query) > 5) then
      begin
      if (Pos('CREATE TABLE ',str_query)>0) then
        begin
        // Es creacion de tabla, intento DROP sobre tabla anterior
        // identifico nombre de tabla
        str_table:= str_query;
        Delete(str_table,1,13);
        Delete(str_table,Pos(' ',str_table),Length(str_table));
        // intento hacer un drop
        ibq_IBQuery.SQL.Text:= 'DROP TABLE '+ str_table;
        try
          ibq_IBQuery.ExecSQL;
        finally end;
        // ahora si ejecuto la creacion de la tabla
        ibq_IBQuery.SQL.Text:= str_query;
        ibq_IBQuery.ExecSQL;
        ibt_IBTransaction.Commit;
      end
      else if (Pos('INSERT INTO ',str_query)>0) then
        begin
        // inserto en la tabla recien creada nuevos valores
        ibq_IBQuery.SQL.Text:= str_query;
        ibq_IBQuery.ExecSQL;
        ibt_IBTransaction.Commit;
      end;
      end;
    end; // for
  ibt_IBTransaction.Commit;
  // ibt_IBTransaction.Active:= false;
  ShowMessage('Base de datos inicializada');
  Close;
end;


gracias.

joal 23-06-2006 06:50:35

Parece asunto de los insert
 
Continuando con mi aventura... separe el SQL en tres. Borrado de tablas, creacion de tablas e insert de datos, a seleccionar segun lo que tuviera en un combobox. En el memo mem_Queries guardo los queries a realizar. Con las primeras dos (drops y creates) no hubo problema, el asunto ha sido con los insert.

Código:

procedure Tfrm_inicializador.bbtn_EjecutarClick(Sender: TObject);
var
  i: integer;
  str_query: string;
begin
  // Corro 1x1 para verificar si hay accion que tomar
  for i:= 0 to mem_Queries.Lines.Count - 1 do
    begin
    str_query:= Trim(mem_Queries.Lines.Strings[i]);
    ibt_IBTransaction.StartTransaction;
    if (Length(str_query) > 5) then
      begin
      ibq_IBQuery.SQL.Text:= str_query;
      ibq_IBQuery.ExecSQL;
      end;
    ibt_IBTransaction.Commit;
    end;
end;

1) Prob 1. Si declaré un campo de las tablas como NOT NULL PRIMARY KEY, al querer realizar el insert me marca que intento duplicar una llave (esta vacia la tabla).

2) Prob 2. Si no declaro llave alguna y cree ese campo ID como un campo normal, al querer hacer el insert obtengo SQL Parse error: EOF in string detected.

Lo curioso es que si ejecuto las mismas instrucciones mediante la herramienta isql de firebird, no obtengo error, por ende, no lo considero error de sintaxis.

ideas?

joal 29-06-2006 02:54:52

Sumario: Problema identificado
 
Pues resulta que aún cuando ejecutaba línea por línea los INSERT (eran aprox 160-180), en uno de los INSERT (como el 35-40) había una comilla adicional, por lo que no lo procesaba correctamente.

Lo que me confundía :o es que el error lo marcaba en el primer INSERT, aún cuando lo corria paso a paso y me indicaba que estaba corriendo el primer INSERT (según eso aún no llegaba a la línea del error).

No se si realiza internamente un preload de todo y luego ejecuta, o a que se deba eso, pero... por si es de su interés, les dejo por si alguien tiene el mismo problema.

Gracias por su ayuda,


La franja horaria es GMT +2. Ahora son las 13:07:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi