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 28-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
¿Como creo una tabla desde un fichero .ini?

Teniendo resuelto el problema de como crear una BD si esta no existe, ahora vuelvo a apelar a vuestra sabiduría.
Mi idea es crear las tablas necesarias desde un fichero .INI
(He oído hablar de archivos .cmp donde pones las sentencias SQL, pero no sé como se usan).
¿Que componente puedo utilizar para cuando lea una sección del fichero .INI ejecute la sentencia SQL?

[TUSUARIOS]
CREATE TABLE TUSUARIOS
(
"IDUSUARIO" INTEGER NOT NULL,
"USUARIO" VARCHAR(50) ,
"CLAVEACCESO" VARCHAR(50) ,
"FECHACADUCIDAD" TIMESTAMP ;
CONSTRAINT "TUSUARIOSPRIMARYKEY" PRIMARY KEY ("IDUSUARIO")
);
CREATE UNIQUE INDEX "USUARIOKEY" ON "TUSUARIOS"("USUARIO");
Responder Con Cita
  #2  
Antiguo 28-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Falta información, que base de datos y que componentes estás usando para conectarte a esa base de datos...



Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #3  
Antiguo 28-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
Utilizo Firebird, y para la creación de la BD estoy utilizando el TIBDataBase
Responder Con Cita
  #4  
Antiguo 28-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Si usas Firebird y los componentes IBX, estos tienen un componente llamado TIBScript que te puede servir para lo que necesitas.

Ahora, los archivos INI usan un formato específico para guardar los valores y no funcionan de la forma como quieres hacerlo. Yo te recomendaría que crees archivos de script (.sql) con la definición de la tabla y en el ini hagas referencia a este archivo.

Archivo INI:
Código:
[Tablas]
TUsuarios=DefTablas\usuarios.sql
usuarios.sql:
Código SQL [-]
create table TUsuarios(
IdUsuario integer not null,
usuario varchar(50),
/* etc */
);
create unique index UsuarioKey on TUsuarios(usuario);

Desde tu aplicación lees el archivo INI, obtienes la ruta del archivo SQL, lo cargas en el componente TIBScript y ejecutas el script.



Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #5  
Antiguo 28-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
maeyanes, ante todo darte las gracias por tu ayuda.
A ver si capto un poco como funciona.
Tengo un TIBDataBase: Name: dbCrearBD
E añadido un TIBScript: Name ScriptBD
DataBase: dbCrearBD
En c:\BD\tbsistema.ini
[Tablas]
TUsuarios=c:\BD\usuarios.sql

En c:\BD\usuarios.sql
CREATE TABLE TUSUARIOS
(
"IDUSUARIO" INTEGER NOT NULL,
"USUARIO" VARCHAR(50) ,
"CLAVEACCESO" VARCHAR(50) ,
"FECHACADUCIDAD" TIMESTAMP ;
CONSTRAINT "TUSUARIOSPRIMARYKEY" PRIMARY KEY ("IDUSUARIO")
);
CREATE UNIQUE INDEX "USUARIOKEY" ON "TUSUARIOS"("USUARIO");

Código Delphi [-]
function LeerCampoIni(etiqueta,texto,campo:string):string;
begin
   Result:='';
   with TIniFile.Create(sFileIni) do
   try
     Result:=ReadString(etiqueta,texto,'');
     Free;
   finally
     Free;
   end;
end;
--------------------------------------------------------------------------
sSQL:=LeerCampoIni('Tablas','TUsuarios','');
if sSQL<>'' then begin
  if dbCrearBd.Connected then dbCrearBd.Connected:=False;
  dbCrearBd.DatabaseName:=NameBD;
  dbCrearBd.Connected:=True;
  with ScriptBD do try
    ScriptBD.Script :=sSQL;
  except

  end;
end;

Me da el siguiente error
[DCC Error] E2010 Incompatible types: 'TStrings' and 'string'

Última edición por Thoma fecha: 28-07-2011 a las 17:33:31.
Responder Con Cita
  #6  
Antiguo 28-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Tú código está bien, solo que estás obteniendo mal la información. Una version corregida sería:

Código Delphi [-]
// La función obtiene la ruta del archivo SQL desde el archivo INI
function GetFilePath(const Section, Key, Value: string): string;
begin
  with TIniFile.Create(sFileIni) do
    try
      Result := ReadString(Section, Key, Value)
    finally
      Free
    end
end;

// Usamos la función:
ScriptFilePath := GetFilePath('Tablas', 'TUsuarios', 'C:\DB\usuarios.sql');
// Configuras componentes
ScriptDB.Script.LoadFromFile(ScriptFilePath); // Cargas el script desde el archivo directamente en la propiedad.
ScriptDB.ExecuteScript;


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #7  
Antiguo 28-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
de nuevo Gracias, ya no me da el error al compilar, pero parecer ser que me crea la BD (abriéndome una ventana para el usuario[SYSDBA] y password[masterkey])
sin la tabla.
Voy a hacer unas comprobaciones....
Responder Con Cita
  #8  
Antiguo 28-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
Cuando me crea la BD según el código que os muestro a continuación, se me abre una ventana pidiéndome el usuario y la password
¿como es posible si lo tengo definido al crea la BD?

Código Delphi [-]


//------------------------------------------------------------------------------
//********************************************[ CReamos La Base De Datos ]******
//------------------------------------------------------------------------------
function crearBD (unidadBD, rutaBD, nameBD, extBD:string; empresaBD:Integer):Boolean;
var
   sEmp:string;
begin
  result := false;
  if empresaBD < 10 then begin
    sEmp:='0'+ IntToStr(empresaBD);
  end else begin
    sEmp:=IntToStr(empresaBD);
  end;
  if empresaBD=0 then sCad:= unidadBD+rutaBD+nameBD+extBD
                 else sCad:= unidadBD+rutaBD+nameBD+sEmp+extBD;
  try
    //--------------------------------------------------------------------------
    //*********** [ creamos la base de datos ]
    //--------------------------------------------------------------------------
    DMSistema.dbCrearBd.DatabaseName := sCad;
    DMSistema.dbCrearBd.Params.Clear;
    DMSistema.dbCrearBd.Params.Add('user ''SYSDBA''');
    DMSistema.dbCrearBd.Params.Add('password ''masterkey''');
    DMSistema.dbCrearBd.Params.Add('PAGE_SIZE = 4096');
    DMSistema.dbCrearBd.SQLDialect := 3;
    DMSistema.dbCrearBd.CreateDatabase;
    //--------------------------------------------------------------------------
    //*********** [ creamos la Tabla de usuarios ]
    //--------------------------------------------------------------------------
       sCad:= unidadBD+ruta+'usuarios.sql';
       sSQL:=LeerCampoIni('Tablas','TUsuarios',sCad);
       if sSQL<>'' then begin
         if DMSistema.dbCrearBd.Connected then DMSistema.dbCrearBd.Connected:=False;
          DMSistema.dbCrearBd.DatabaseName:=NameBD;
          DMSistema.dbCrearBd.Connected:=True;
          with DMSistema.ScriptBD do try
            DMSistema.ScriptBD.Script.LoadFromFile(sSQL);
            DMSistema.ScriptBD.ExecuteScript;
          except
          end;
       end;

    result := True;
  except
    result := false;
  end;
end;
Responder Con Cita
  #9  
Antiguo 28-07-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Hola Thoma, primero que nada me parece un buen trabajo el que estas desarrollando, yo lo que hago todo lo vuelco a un memo y luego creo la base de datos. En cuanto a tú pregunta en el IBDatabase sería

Código Delphi [-]
IBDatabase1.LoginPrompt:=False;

Espero te ayude.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #10  
Antiguo 28-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
Hola Jose Luis, gracias por tu comentario, la verdad es me está costando un poco el Delphi, pero veo que es bastante potente y en ello estoy. Voy a probar lo que me dices del “LoginPrompt” y te comento.
¿Me podrías explicar un poco lo del memo que me comentas?
Un saludo..

Última edición por Thoma fecha: 28-07-2011 a las 21:46:46.
Responder Con Cita
  #11  
Antiguo 29-07-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 23
José Luis Garcí Va camino a la fama
Te comento Thoma. lo que tu haces es volcarlo directamente al IbSript, en su SQL, en mi sistemacreo un init por taba con varias caracteristicas y entre lo que vuelco al init tengo en proyecto volcar la sentencia, para ello lo pasoa un memo en vez de el ibscript, con lo que puedo guardarlo independientemente, ver la sentencia antes de ejecutarla, etc, cargala es muy simple sólo tendrias que volcar el contenido del memo en el ibScript.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #12  
Antiguo 29-07-2011
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
En lugar de un Memo, sugiero un componente SynEdit, gratuito y open source, en apenas 10 segundos ya reconoce el SQL (colores en palabras reservadas y demás), se recomienda su uso.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #13  
Antiguo 29-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
¿Puedo utilizar el Script para insertar un registro en la tabla?
he utilizado el:
Código Delphi [-]
 
    Script.LoadFromFile(sSQL);

para crear la tabla en la base de datos, y quisiera insertar el primer registro pero sin utilizar un archivo externo (.sql) sino desde el mismo delphi

Código Delphi [-]
   Script.Clear;
   sSQL:='';
   sSQL:='INSERT INTO TUsuarios (IDUSUARIO,USUARIO,CLAVEACCESO) values (1,'  + QuotedStr('') + ',' + QuotedStr('0000');
   Script.¿? 
   ExecuteScript;

de este modo si me funciona
Código Delphi [-]
       //------------------------------------------------------------------
       //*********** [ Creamos el primer registro en la tabla ]
       //------------------------------------------------------------------
       sCad:= unidadBD+ruta+'regusuarios.sql';
       sSQL:=LeerCampoIni('RegUsuario','RegUsuarios',sCad);
       if sSQL<>'' then begin
          with DMSistema.ScriptBD do try
             Script.Clear;
              Script.LoadFromFile(sSQL);
              ExecuteScript;
           except
            end;
        end;

Última edición por Thoma fecha: 29-07-2011 a las 15:20:22.
Responder Con Cita
  #14  
Antiguo 29-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Código Delphi [-]
Script.SQL.Text := sSQL; // Sustituyes todo el script
// o
Script.SQL.Add(sSQL); // Agregar la línea al script existente

Solo tienes que checar que cada línea termine con ;...


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #15  
Antiguo 29-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
Hola maeyanes.
no me salen las propiedades .SQL.Text del Script

[DCC Error] URutinas.pas(193): E2003 Undeclared identifier: 'SQL'
[DCC Error] URutinas.pas(193): E2066 Missing operator or semicolon
[DCC Fatal Error] Gestion.dpr(13): F2063 Could not compile used unit 'FrIndex.pas'
Responder Con Cita
  #16  
Antiguo 29-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Disculpa, me confundí con el nombre de la propiedad:

Código Delphi [-]
with DMSistema.ScriptBD do 
  try
    // Si vas a usar Script.Add
    Script.Clear;
    Script.Add(sSQL);
    // Si vas a usar Script.Text
    Script.Text := sSQL;
    ExecuteScript;
  except
  end;


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #17  
Antiguo 29-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
ahora me compila bien, pero con este código no me inserta el registro en la tabla

Código Delphi [-]
   Script.Clear;
   Script.Text := 'INSERT INTO TUsuarios (IDUSUARIO,USUARIO,CLAVEACCESO) values (1,' + QuotedStr('admin')+ QuotedStr('0000')+')';
   ExecuteScript;

sin embargo desde el editor SQL del IBExpert si me inserta el registro
Código Delphi [-]
  INSERT INTO TUsuarios (IDUSUARIO,USUARIO,CLAVEACCESO) values (1,'admin','0000')

Última edición por Thoma fecha: 29-07-2011 a las 16:43:43.
Responder Con Cita
  #18  
Antiguo 29-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

La sentencia INSERT está mal generada, le falta el paréntesis final, de seguro te envía una excepción, la cual estás escondiendo en tu código. La forma correcta sería:

Código Delphi [-]
sSQL := 'insert into TUsuarios values(1, ''admin'', ''0000'');'


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #19  
Antiguo 29-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
OK, lo encontre. me faltaba separar con la ',' entre (admin) y (0000)
voy a probar como tu me dices.
Responder Con Cita
  #20  
Antiguo 29-07-2011
Avatar de Thoma
Thoma Thoma is offline
Miembro
NULL
 
Registrado: abr 2011
Posts: 46
Poder: 0
Thoma Va por buen camino
con este script si me funciona.
Código Delphi [-]
Script.Text := 'INSERT INTO TUsuarios (IDUSUARIO,USUARIO,CLAVEACCESO) values (1,' + QuotedStr('admin')+','+QuotedStr('0000')+')';
me faltaba poner el último +')';
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
¿Cómo creo una base de datos desde Delphi? Thoma Firebird e Interbase 12 27-07-2011 20:27:16
como creo una tabla mientras el programa esta en ejecucion? gonza_619 Varios 3 15-02-2010 13:44:36
insertar datos en una tabla desde fichero XML??? mguixot Conexión con bases de datos 2 17-05-2006 16:18:04
Como creo campos en una tabla Paradox?? JoseQ Conexión con bases de datos 1 13-07-2004 19:07:09
Como creo, inserto y leo un txt desde delphi? danytorres Varios 5 28-11-2003 21:17:17


La franja horaria es GMT +2. Ahora son las 00:27:48.


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