Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-06-2006
joal joal is offline
Miembro
 
Registrado: jun 2006
Posts: 10
Poder: 0
joal Va por buen camino
Red face 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
Responder Con Cita
  #2  
Antiguo 21-06-2006
Avatar de waltergomez
waltergomez waltergomez is offline
Miembro
 
Registrado: may 2006
Posts: 202
Poder: 19
waltergomez Va por buen camino
Si autocommit es true u on entonces no debrias tener problemas cuando la transaccion esta inactiva.
Responder Con Cita
  #3  
Antiguo 22-06-2006
joal joal is offline
Miembro
 
Registrado: jun 2006
Posts: 10
Poder: 0
joal Va por buen camino
Unhappy 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). 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.

Última edición por joal fecha: 22-06-2006 a las 02:21:09. Razón: formateo
Responder Con Cita
  #4  
Antiguo 23-06-2006
joal joal is offline
Miembro
 
Registrado: jun 2006
Posts: 10
Poder: 0
joal Va por buen camino
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?
Responder Con Cita
  #5  
Antiguo 29-06-2006
joal joal is offline
Miembro
 
Registrado: jun 2006
Posts: 10
Poder: 0
joal Va por buen camino
Talking 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 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,
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como puedo hacer correr mi apliccion en Intraweb ?? supermanpy Varios 0 05-06-2006 23:17:08
Como correr un archivo externo? fayala Firebird e Interbase 3 07-04-2005 03:56:00
No consigo hacer un INSERT akela Conexión con bases de datos 3 22-11-2004 00:46:42
Como correr multiples sentencias SQL en un Tquery al hacer un .ExecSQL/.open orfeo Conexión con bases de datos 6 27-03-2004 19:55:25
Quiero Saber como hacer que un boton se vea que esta siendo pulsado Julio César Varios 2 27-11-2003 18:34:11


La franja horaria es GMT +2. Ahora son las 03:36:47.


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
Copyright 1996-2007 Club Delphi