Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Ejecutar Script *.SQL desde Delphi

Hola gente, ya se que si se pregunto lo mismo en otros temas, pero ninguna respuesta satisfizo una solucion para mi...

Planteo brevemente:

Utilizo el motor MySQL Server 5.0, y generé un Back Up de mi base de datos, devolviendome el archivo: <mi_bd .sql>, el cual contiene las instrucciones para crear /*si no exise*/ la base de datos y sus tablas...

Ahora bien, mi pregunta es:

-- ¿Como Restaurar dicha base de datos (mi_bd .sql) desde delphi?

(Mi intencion es que cuando ejecute por 1ra vez la aplicacion que estoy realizando, pues a la vez tambien se cree la bd).


Ya Restauré desde la linea de comandos de DOS, con lo siguiente:
-------------------------------------------------------------------------
1) Primero me situé en la carpeta de los binarios de MySQL, con el comando 'CD' de DOS:

Código:
C:\Document and Settings\Administrador> 
                    CD "c:\Archivos de programa\MySQL\MySQL Server 5.0\Bin"



4) Luego Restauré Satisfactoriamente un script <mi_bd.sql> desde DOS, así:

Código:
C:\Archivos de programa\MySQL\MySQL Server 5.0\Bin>
                    MySQL  --user=root --password=root mi_bd < c:\ mi_bd.sql
-------------------------------------------------------------------------

Ahora bien, esos mismos comandos de Restauracion que sí funcionaron en DOS, los apliqué infructuosamente, esta vez desde Delphi con WinExec, así:

Código Delphi [-]WinExec(PChar('cmd /c CD "c:\Archivos de programa\MySQL\MySQL Server 5.0\Bin">MySQL --user=root --password=root mi_db < c:\mi_bd.sql'), SW_Hide);


------------------------------------------------------------------------
Intente mas posibles convinaciones con winexec pero, ninguna che! ya llevo un dia entero intentando! que bajon!


Si tienen alguna solucion... o alguna correccion, o si tal vez intento con ShellEXEcute? pero cual sería la sintaxis exacta?


(y fuera de tema, si alguien trabajo con delphi-mysql, que archivos son necesarios instalar de dicho Motor? claro, la idea es resumir en <un solo> instalador: el motor de base de datos, la conexion obdc, la creacion de la estructura de la base de datos, y el ejecutable... o tal vez en 2, dado que mysql es externo...


Desde ya, gracias...
Responder Con Cita
  #2  
Antiguo 05-02-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
El "WinExec" no funciona porque no estás pasando correctamente los parámetros, aparte de que la redirección de la corriente de entrada para el nuevo proceso (el caracter "<" del comando) no creo que sea reconocido como tal.

Si quieres hacerlo desde Delphi, lo que deberías hacer es cargar el archivo SQL, conectar directamente con la base de datos y pasarle el guión (script) utilizando los componentes adecuados. Es posible que debas dividir el archivo para pasarle los comandos SQL uno a uno (el separador suele ser el caracter punto y coma) y quizá también eliminando los comentarios.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 05-02-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Como dice nuño es correcto, inclusive es más sencillo usar por ejemplo ZSQLProcessor de las Zeos y le cargas el script directamente y lo ejecutas desde ahi.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #4  
Antiguo 05-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Gracias Muño, gracias Azid.

Tenía entendido que si se podia con winexec...

Bueno, la cuestion es que e decidido pasar cada una de los comandos SQL embibidos en el codigo Delphi...

Ahora bien mi duda es la siguiente...

Hasta ahora e utilizado componentes de BDE (TQuery,TDataBase...) con MySQL Server 5.0, sin ningun problema

Los componentes Zeos los conosco por teoria nomas y e visto su sencillez, ahora bien... me plantea la duda, cual es mejor? BDE vs ZEUS?

o tal vez existe algun otro componente mejor para manejar bases de datos?

en definitiva, cual me recomiendan? y cual serían los archivitos (.dll,...) necesarios para instalar en la pc del usuario?


-----------------------------------------------------------------------------------------

En todo caso, si uso directamente un componente como ustedes me recomiendan, el componente que use, requiere una conexion inicial con el <aliasname> de una base de datos. y partiendo del hecho de que la primera vez que corra la aplicacion, pues no existirá ni la base de datos ni su alias obdc que requiere dicha aplicacion...

a que bd conecto entonces dicho componente?
Responder Con Cita
  #5  
Antiguo 05-02-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
BDE es anticuado, hace muchos años que se abandonó.
Zeos es moderno, actual y muy completo.
Responder Con Cita
  #6  
Antiguo 05-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Gracias Casimiro. Ahora bien, con el bde,utilizaba unos archivos controladores (BdeInst.dll, minireg.exe) que los instalaba junto con el innosetup en otra pc sin delphi.

Con el zeos, cuales de estos archivos son necesarios? o directamente pongo el ejecutable delphi en otra pc y ya corre?

Ah, y e visto que existen varias versiones de Zeos, cual es mas recomendable?
Responder Con Cita
  #7  
Antiguo 05-02-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Únicamente debes instalar la biblioteca libmysql.dll en la máquina destino.

// Saludos
Responder Con Cita
  #8  
Antiguo 05-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Ok, gracias roman.

Entonces, antes de correr por primera vez la aplicacion en otra pc (logicamente la base de datos para tal no exista), y al correr por primera vez se cree la base de datos utilizando los componentes ZEOS.

Ahora bien mi duda:

En todo caso, si cambio mis componentes BDE por Zeos, a este hay que vincularlo a una base de datos

como conecto la propiedad del componente con el que lanzare la creacion de la bd:

databaseName:='<nombre de la base de datos>';

con que otra base de datos podria vincularlo a esta primer consulta del zeos?
Responder Con Cita
  #9  
Antiguo 05-02-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
El enfoque de BDE vs Zeos y otros mas es totalmente distinto, la base de dastos puede o no existir precisamente en la pc donde se ejecuta la aplicación. En el caso de las Zeos necesitarás al menos dos componentes para hacer lo que quieres: ZConnection, en donde le debes decir algunos datos del servidor a donde te quieres conectar (usuario, passw, direccion del host y protocolo a usar [mysql en este caso]) y luego el ZScriptProcessor al cual vas a a conectar con el ZConnection previamente configurado.

Es decir, le tienes que decir al script en que servidor va a correr, informacion que ya contiene el zconnection. Si gustas postea tu archivo sql y te pongo un proyecto completo que hace lo que quieres, realmente es sencillo.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #10  
Antiguo 05-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Basicamente la estructura del script es asi:

Código SQL [-]
CREATE DATABASE /*!32312 IF NOT EXISTS*/ a_db;
USE a_db;

DROP TABLE IF EXISTS `alumnos`;
CREATE TABLE `alumnos` (
  `Doc` int(9) NOT NULL,
  `Nombres` varchar(20) default NULL,
  `Apellidos` varchar(20) default NULL,
  PRIMARY KEY  (`Doc`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

(Solo puse una tabla ejemplo y algunos campos para que no sea largo)


El tema es que ya he logrado ejecutar las sentencias en el evento OnCreate del Form principal, primero preguntando si existe o no la base de datos en el directorio y luego creando, todo perfecto, asi:

Código Delphi [-]
procedure TFPrincipal.crear_a_bd;
var fil:string;
b:integer;
begin
fil:= AnsiReplaceStr('C:\Archivos de programa\MySQL\MySQL Server 5.0\data\a_db\db.opt','\','\\');

    if FileExists(fil) then
    begin
    b:=1;
    end
    else
    begin
    b:=0;
    end;

IF b=0 THEN
begin
q.Close; q.SQL.Clear;
q.SQL.Add('CREATE DATABASE IF NOT EXISTS a_db');
q.ExecSQL;
q.Close; q.SQL.Clear;
q.SQL.Add('USE a_db');
q.ExecSQL;

q.Close; q.SQL.Clear;
q.SQL.Add('CREATE TABLE `alumnos` (`Doc` int(9) NOT NULL, `Nombres` varchar(20) default NULL, `Apellidos` varchar(20) default NULL,  PRIMARY KEY  (`Doc`))');
q.ExecSQL;
end;

El procedimiento anterior, lo hice con componentes BDE, funcionoo perfectamente si le agrego en la propiedad del componente Tdatabase:
<AliasName= 'cualkier otra base de datos existente'>

Hasta ahi todo perfecto, ya funciona todo si no menciono la base de datos a crear.

Pero el tema, es a cual base de datos vinculo al componente (sea BDE ò Zeos), una <por defecto> que digamos siempre pueda existir en cualkier otra pc... no se... a eso va mi interrogante...

Última edición por nadlor fecha: 05-02-2010 a las 23:58:40.
Responder Con Cita
  #11  
Antiguo 06-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Azid, si es que tenias otra solucion en mente, te lo agradeceria.
Responder Con Cita
  #12  
Antiguo 06-02-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Si conoces y tienes instalado Zeos con gusto te pongo el proyecto completo si te lo pongo y no tienes Zeos nomás te voy a confundir...
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #13  
Antiguo 06-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Acabo de instalar Zeos 6.6.6...
Responder Con Cita
  #14  
Antiguo 07-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Bueno, para cerrar este tema, comento que e solucionado mi inconveniente.

Cambié los componentes BDE por los componentes ZEOS.

Estos ultimos, me permiten conectarme directamente a la base de datos sin especificar DNS de usuario, conexiones ODBC.

El script *.sql (creacion de base de datos del sistema) que queria ejecutar al principio con ShellExecute, opte gracias a este foro, por embeber el codigo sql del script en el codigo de delphi, lanzando las sentencias de creacion como mostré anteriormente con los componentes ZQuery de Zeos.

Ahora bien mi ultima duda era, si en principio en la maquina del usuario no existirìa mi base de datos sino hasta que yo la creace al ejecutar por primera vez mi aplicacion hecha en delphi;


¿a qué base de datos relaciono la propiedad <database> del componente ZConnection (ligado al zquery con el que largo los comandos de creacion)?

Pues si le pongo una base de datos inexistente, no me dejara ejecutar el comando sql.

Ligue dicha propiedad a la base de datos <mysql> o <test> que son creadas en la instalacion de MySQL.

y como con Zeos no se requiere conexion odbc, me facilito mas aun el trabajo.

Es una solucion simple, tal vez no es la mas adecuada, pero funcionó!

Salu2
Responder Con Cita
  #15  
Antiguo 13-02-2010
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 21
JXJ Va por buen camino
Question

Cita:
Empezado por AzidRain Ver Mensaje
Si conoces y tienes instalado Zeos con gusto te pongo el proyecto completo si te lo pongo y no tienes Zeos nomás te voy a confundir...
AzidRain
¿puedes poner el proyecto completo?,
yo teng zeos instalado y aprendiendo a usarlo

gracias.
Responder Con Cita
  #16  
Antiguo 13-02-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por nadlor Ver Mensaje
¿a qué base de datos relaciono la propiedad <database> del componente ZConnection (ligado al zquery con el que largo los comandos de creacion)?

Pues si le pongo una base de datos inexistente, no me dejara ejecutar el comando sql.

Ligue dicha propiedad a la base de datos <mysql> o <test> que son creadas en la instalacion de MySQL.
No necesitas relacionarla con ninguna base en específico; es decir, puedes dejar en blanco la propiedad Database y ejecutar comandos SQL.

// Saludos
Responder Con Cita
  #17  
Antiguo 13-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Cita:
Empezado por roman Ver Mensaje
No necesitas relacionarla con ninguna base en específico; es decir, puedes dejar en blanco la propiedad Database y ejecutar comandos SQL.

// Saludos

Tenés toda la razon roman! je...


dejando dicha propiedad en blanco igual me toma la consulta...

pero si las propiedades <HostName>, <password>,<user> y <protocol>

sino, corrijanme


nos vemos... gracias! aguante Zeos!!!!
Responder Con Cita
  #18  
Antiguo 14-02-2010
nadlor nadlor is offline
Miembro
 
Registrado: dic 2009
Posts: 12
Poder: 0
nadlor Va por buen camino
Aun asi consideraria conveniente que alguien que lo haya hecho, dé la solucion al titulo de este Tema:


<Ejecutar Script *.SQL desde Delphi>


Yo encontré otra solucion, ya que mi caso tenia otras alternativas validas, pero creo que hay gente que tal vez encuentre y consulte este tema guiado por el titulo y le pase como me paso a mi al principio que consulte otros foros con titulo similar sin dar con la solucion final y por ello decidí abrir este nuevo tema.

Yo planteaba esto, pero segun sé estan mal pasados los parametros:

Código Delphi [-]

WinExec(PChar('cmd /c CD "c:\Archivos de programa\MySQL\MySQL Server 5.0\Bin">MySQL --user=root --password=root mi_db < c:\mi_bd.sql'), SW_Hide);

y tambien seria bueno esto:

Cita:
Empezado por AzidRain
Si conoces y tienes instalado Zeos con gusto te pongo el proyecto completo si te lo pongo y no tienes Zeos nomás te voy a confundir...
Responder Con Cita
  #19  
Antiguo 10-01-2012
franroju franroju is offline
Miembro
NULL
 
Registrado: ene 2012
Posts: 55
Poder: 13
franroju Va por buen camino
Hola. Soy nuevo en Zeos pero leyendo por estos foros vi que esta muy recomendado y decidí utilizarlo en una aplicación de prueba. Me surgió el siguiente problema:

Tengo en un form un ZConnection, un ZTable, un DataSource y un DBGrid. Creo la base de datos externamente, es decir, con un soft. de administración de base de datos, conecto las "piezas" y funciona perfectamente.

Ahora bien, quiero crear la base de datos y las tablas desde delphi, para facilitar la instalación en el cliente. Para esto utilizo un ZSQLProcessor en el cual escribo los scripts SQL, y no me informa ningún error, pero el DBGrid queda en blanco, es decir, sin datos y sin el nombre de las columnas. Como que algo falla en la conexión. Les paso el código para que vean las propiedades que modifico, tal vez olvido alguna o hago algo mal y no me doy cuenta.

Código Delphi [-]
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  ZSQLProcessor1.Script.Add('CREATE DATABASE IF NOT EXISTS prueba;');
  ZSQLProcessor1.Script.Add('USE prueba;');
  ZSQLProcessor1.Script.Add('CREATE TABLE IF NOT EXISTS `cuentacorriente` (`numero` int(9) NOT NULL, `nombre` varchar(20) NOT NULL, `monto` float(8,2) NOT NULL,  PRIMARY KEY  (`numero`));');
  ZSQLProcessor1.Execute;

  con.Database := 'prueba'; //ZConnection
  con.Catalog := 'prueba';
  con.Connect;
  ZTable1.TableName := 'cuentacorriente';
  ZTable1.Properties.Add('select * from cuentacorriente;');
  ZTable1.Active;
end;

La base de datos y la tabla las crea. Supongo que hay alguna falla con el ZTable pero no me doy cuenta cual puede ser. Hago un Showmessage de la propiedad Active de la tabla y me da 0, o sea que no queda activa y no puedo saber por qué.
Muchas gracias y espero su ayuda.
Responder Con Cita
  #20  
Antiguo 10-01-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

No estoy seguro de cuál sea el problema pero por lo menos parece que te has olvidado de enlazar el componente ZTable con el ZConnection, algo como:

Código Delphi [-]
ZTable1.Connection := con;

Por otra parte, no creo que estas sentencias sean necesarias:

Código Delphi [-]
con.Catalog := 'prueba';
ZTable1.Properties.Add('select * from cuentacorriente;');

Finalmente, parece que también te has olvidado de abrir la tabla. La sentencia:

Código Delphi [-]
ZTable1.Active;

en realidad no hace nada. Active es una propiedad que simplemente indica si la tabla está o no abierta. Tendrías que usar

Código Delphi [-]
ZTable1.Active := true;

o bien

Código Delphi [-]
ZTable1.Open;

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Ejecutar script desde el isql victork_py Firebird e Interbase 9 25-05-2017 20:56:54
Ejecutar script toni.vi Conexión con bases de datos 6 19-02-2009 12:51:53
Ejecutar script sql en firebird jlalvarez Firebird e Interbase 8 05-03-2008 01:25:42
Ejecutar Script SQL con DELPHI patay SQL 1 06-08-2007 18:12:26
Componente ejecutar Script buitrago Conexión con bases de datos 3 27-11-2003 09:40:54


La franja horaria es GMT +2. Ahora son las 20:36:23.


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