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 12-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
Question Conexion con Access

Hola a todos.

Me he llevado varios dias leyendo este foro y es una maravilla y una gran ayuda para poder programar en delphi, mis felicitaciones. Ahora bien, me gustaria hacer una consulta sobre una eleccion que debo de hacer:

Estoy haciendo un proyecto Delphi el cual en la mayoria de los casos se instalara en una red (porque normalmente sera una oficina) y en la cual se podran hacer distintas operaciones comunes en cualquier base de datos. Pues bien, e decidido utilizar access por su gran sencillez y versatilidad, pero aun es una desicion revocable si ustedes me lo aconsejarais.

La mayoria de las oficinas donde se instalará la aplicacion sera de la siguiente manera:

-Una maquina que hara de servidor, donde se instalara la aplicacion y la base de datos (como he dicho antes Access).

-Varios clientes que accederan a la base de datos que se instalo en el paso anterior, es decir, el servidor.

-Ademas cualquiera de estos clientes o el mismo servidor tendra una opcion en la cual podra elegir subir registros (los que se elijan) previamente almacenados en la base de datos local hacia una base de datos MySQL que hay en un servidor web. Tambien podran bajarse registros a la base de datos local...

Pues bien me gustaria que me aconsejaran sobre que conexiones utilizar en mi aplicacion sobre: ( 1 ) la conexion del cliente al servidor (Access) y ( 2 ) del servidor al servidor Remoto (MySQL).

En la conexion ( 1 ) explorando e visto por ahí la existencia de los archivos udl mas concretamente con el Proveedor "Microsoft Jet 4.0 OLE DB". Me gustaria saber si esta es una buena opcion combinandola con las herramientas ADOConnection para el caso que os he propuesto. Y me gustaria saber si se puede manipular este archivo desde Delphi 7 para variar la ruta de la base de datos y como hacerlo.

En la conexion ( 2 ) aun no he elegido nada, si me pudieran sugerir conexiones y herramientas se lo agradeceria enormemente.

Muchas gracias por su atencion y 1 saludo a todos

Última edición por Moises22 fecha: 12-12-2005 a las 13:45:05.
Responder Con Cita
  #2  
Antiguo 12-12-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!


Por lo que se refiere a la conexión con Access, fijate que en la propiedad connectionString tienes la ruta a la base de datos.

Lo que hago normalmente es guardarme en el registro de windows la ruta al servidor, cuando se ejecuta el programa voy a recogerla y concateno la connectionstring con el resto de parámetros. Entonces abro la conexión.

Te puedes montar una pequeña pantalla para configurar el valor que tienes guardado en el registro, por si alguna vez cambia de ubicación la base de datos.

Un saludo

Edu
Responder Con Cita
  #3  
Antiguo 13-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
ok, es decir, editarlo como un fichero de texto cambiando la ruta en el caso de que quisiera cambiarla cierto???

Se me plantean dos preguntas:

¿Como manejan los registros de windows?

¿En lo referente a la conexion a MySQL alguien me puede ayudar?

Gracias por todo
Responder Con Cita
  #4  
Antiguo 13-12-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Buenas!


La idea es la siguiente:

Creas un DataModule y le colocas un TADOConnection (que llamaremos conexion) y un TOpenDialog.

El código de esta unidad es el siguiente:

Código Delphi [-]
unit UDataModule;
interface
uses
  SysUtils, Classes, DB, ADODB, Dialogs, Registry, Windows, Forms;
const
  bbdd1 = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
  bbdd2 = ';Persist Security Info=False;Jet OLEDBatabase Password=pepito';
type
  TDataMod = class(TDataModule)
    Conexion: TADOConnection;
    OpenDialog1: TOpenDialog;
    procedure DataModuleCreate(Sender: TObject);
  private
    { Private declarations }
    fBBDD : String;
  public
    { Public declarations }
    property BBDD : String read fBBDD write fBBDD;
  end;
var
  DataMod: TDataMod;
implementation
{$R *.dfm}
procedure TDataMod.DataModuleCreate(Sender: TObject);
var Reg : TRegistry;
begin
    Reg := TRegistry.Create;
    try
        Reg.RootKey := HKEY_LOCAL_MACHINE;
        if Reg.OpenKey('SOFTWARE\EduP\pedidos', false) then
        Begin
            fBBDD := Reg.ReadString('BBDD');
        End
        else
        Begin
            if (Reg.OpenKey('\SOFTWARE\EduP\pedidos', true)) and
               (OpenDialog1.Execute) then
            Begin
                fBBDD := OpenDialog1.FileName;
                Reg.WriteString('BBDD', fBBDD);
            End
            else
            Begin
                Showmessage('Error en la instalación de la aplicación');
                Application.Terminate;
            End;
        End;
        if Conexion.Connected then
          Conexion.close;
        try
            Conexion.ConnectionString := bbdd1 + fbbdd + bbdd2;
            Conexion.Open;
        except
          if (Reg.OpenKey('\SOFTWARE\EduP\pedidos', true)) and
               (OpenDialog1.Execute) then
            Begin
                fBBDD := OpenDialog1.FileName;
                Reg.WriteString('BBDD', fBBDD);
                Conexion.ConnectionString := bbdd1 + fbbdd + bbdd2;
                conexion.Open;
            End
            else
            Begin
                Showmessage('Error en la instalación de la aplicación');
                Application.Terminate;
            End;
        end;
    finally
      reg.Free;
    end;
end;
end.
En la creación del DataModule el programa va a buscar en el registro de Windows la rama HKEY_LOCAL_MACHINE\software\EduP\Pedidos y recoge un valor de cadena que se llama BBDD. En este valor se almacena la ruta y el nombre de la base de datos.

Si la clave no existe se lanza el opendialog para que se seleccione la base de datos y guarda el valor.

Una vez tiene el valor concatena los textos para la connectionString y abre la conexión a la base de datos.

A partir de ahí cualquier TADOTable o TADOQuery necesita acceder al TADOConnection del DataModule y listo.

Espero que te sirva

Edu
Responder Con Cita
  #5  
Antiguo 13-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
Me da un error de lectura.

Yo lo que hago es incluir UDataModule en el formulario principal y desde alli hago:

DataMod.DataModuleCreate(self);

La linea donde me da el error es esta:

Begin
if (Reg.OpenKey('\SOFTWARE\Gestorvvs\datos', true)) and
(OpenDialog1.Execute) then

...

Te pediria un ultimo favor y es que al no saber utilizar los DataModule me gustaria que me pusieses un ejemplo sobre como harias tu una sentencia SQL una vez obtenida la UDataModule.pas.

Supongo que una vez hecha esta unidad la puedo utilizar todas las veces que quiera.Muchas gracias por todo y un saludo

Última edición por Moises22 fecha: 13-12-2005 a las 15:03:50.
Responder Con Cita
  #6  
Antiguo 13-12-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Esta unidad va a ser común para todo el proyecto. En cualquier formulario que necesites acceder a la base de datos deberás incluirla en el uses. Después pinchas un TADOQuery en el formulario y miras la ventana de propiedades: Encontrarás una que se llama Connection. Si deslpiegas te va a aparecer la conexión del DataModule. Una vez seleccionada la conexión debes utilizar la propiedad SQL para escribir la sentencia, y desde código asignar los parámetros y abrir este TADOQuery. Mut fácil.


Edu
Responder Con Cita
  #7  
Antiguo 14-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
Unhappy

Sip correcto, pero mi problema es el siguiente.

He hecho lo que me has dicho y añado en el form que yo quiero lo siguiente:

ADOQuery1.SQL.Add('Select * from usadas');
ADOQuery1.Open;
ADOQuery1.Free;

Pues bien, me da un error que me dice "Missin connection or ConnectionString", parece que no pilla bien la conexion. El DataModule lo tengo exactamente = que el que me propusiste. Gracias por la ayuda de todas formas
Responder Con Cita
  #8  
Antiguo 14-12-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Te falta el ADOQuery1.connection := DataModule.Conexion

Si lo tienes pinchado en el formulario puedes ir a la página de propiedades y seleccionalo.

Un saludo

Edu
Responder Con Cita
  #9  
Antiguo 14-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
Eso lo puse como me dijiste, es decir, en las propiedades del objeto TADOQuery mire Connection, desplegue y me salio automaticamente DataMod.Conexion , supongo que si hago estoy no le tengo que hacer en el codigo.

Aunque tb e de decirte que e probado a poner lo que me dijiste desde el codigo, es decir, ADOQuery1.Connection:=DataMod.Conexion; y me sigue dando exactamente el mismo error.

La UDataModule esta copiada de la que me propusiste, tengo la impresion de que algo anda mal alli, pero tb podria ser que me pasara por alto algo al enlazar con ADOQuery.

¿ Que puede ser ? ¿ Que se me ha podido pasar por alto ?

Última edición por Moises22 fecha: 14-12-2005 a las 10:04:49.
Responder Con Cita
  #10  
Antiguo 14-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
He resuelto uno de los problemas leyendo en el foro, y es que habia que poner en la ejecucion de la Aplicacion que se creara el UDataModule antes que el Unit1.

Ahora me da un problema que considero mas logico aunque no consigo saber por qué.Me dice:

No se encontro el origen de datos o no especifico un o no se especifico ningun controlador predeterminado

¿¿¿¿ Que estoy haciendo mal ?????
Responder Con Cita
  #11  
Antiguo 14-12-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Prueba lo siguiente: En la conexión del datamod haces doble click sobre connectionString para que te salga una ventana en la que puedes constriur (build) la connectionString. Con esto puedes montar manualmente la conexión a la base de datos, comprobando que funcione.


Después te coges el connectionString que te ha construido, y lo sacas a las variables bbdd1 y bbdd2 que tienes en el código quitando la parte por donde dice la ubicación de la base de datos

De esta forma ya tienes construida una connectionString correcta y le puedes cambiar la ubicación de la base de datos.

Edu
Responder Con Cita
  #12  
Antiguo 14-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
Unhappy

He hecho lo que me has dicho y me dice "Error de autentificacion".

Las variables quedaron así:

const
bbdd1 = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
bbdd2 = ';Mode=Share Deny None;Persist Security Info=False';


Mi desesperación cada vez es mas grando porque por más que miro no encuentro el error. El problema veo que esta en que no conecta bien, pero mi impresion sobre el codigo del DataModule es que no deberia ni si quiera de probar la conexion puesto que en principio no hay ninguna clave creada y deberia de saltar el explorador, pero que va salta el error de conexion.

Por cierto Mi Access es el 2003, por si pudieran venir de ahi los problemas.

Espero me puedan ayudar, pero de todas gracias muchisimas gracias por la atencion dedicada hasta ahora.
Responder Con Cita
  #13  
Antiguo 14-12-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Cuando haces el build del connectionString tienes un botón que se llama "test connection". Hasta que no te diga "connection succees" no te va a funcionar nunca.


Prueba con estas cadenas:
bbdd1 = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
bbdd2 = ';Persist Security Info=False';

También hay una página donde se puede indiar usuario y password. En el usuario dice "Admin". Dejalo en blanco, y deja marcada la opción de "blank password".

Asegurate que la propiedad connected del TADOConnection vale false, si no ya lo encuentra conectado y da errores raros.

Un saludo

Edu
Responder Con Cita
  #14  
Antiguo 14-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
Eso que me has dicho si me funciona,osea, haciendo el Build elijo una base de datos y tal y hago el test y funciona, pero se supone que despues de esto debo borrar la cadena de ConnectionString no?? y ponerla en las variables...

Pues bien a partir de ahi es donde me da los errores raros, vacio en ConnectionString para que lo coja de las variables y salte el explorador de archivos y nada, solo da errores.

Estoy completamente desesperado... , pero de nuevo infinitas gracias por tu paciencia
Responder Con Cita
  #15  
Antiguo 15-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
Talking

Ya he solucionado el problema. Era que en el ConnectionString del TADOConnection yo lo vaciaba pues creia que debia estar limpio para que funcionara el sistema que estabamos montando. Una vez me cree un ConnectionString al cual le quite la ruta todo me funciona correctamente, excepto una cosa y es que en el codigo que me facilitaste encuentro un pequeño desajuste, cuando salta el explorer si lo cancelo la aplicacion se cierra, pues bien yo he de permitir que el usuario no elija ninguna base de datos si lo desea, y tambien que en el momento que quiera pueda cambiar la ruta de la base de datos.

Voy a Trabajar con ello y en cuanto tenga un resultado la pego aqui para que los demas usuarios no tengan el problema que yo tube.

MUCHAS GRACIAS POR TODO
Responder Con Cita
  #16  
Antiguo 15-12-2005
Moises22 Moises22 is offline
Miembro
 
Registrado: sep 2005
Posts: 53
Poder: 19
Moises22 Va por buen camino
Thumbs up

He desarrollado en la unidad que aqui pusieron un poco mas para que se pueda cambiar la ruta y para que si no se mete una ruta correcta no la acepte y welva a intentarlo en el siguiente inicio. Todo quedo asi:

Código Delphi [-]
unit UDataModule;
interface
uses
SysUtils, Classes, DB, ADODB, Dialogs, Registry, Windows, Forms,UnitGlobal;
const
bbdd1 = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';
bbdd2 = ';Persist Security Info=False';
type
TDataMod = class(TDataModule)
Conexion: TADOConnection;
OpenDialog1: TOpenDialog;
procedure DataModuleCreate(Sender: TObject);
procedure cambiardb(Sender: TObject);
private
{ Private declarations }
fBBDD : String;
public
{ Public declarations }
property BBDD : String read fBBDD write fBBDD;
end;
var
DataMod: TDataMod;
implementation
{$R *.dfm}
procedure TDataMod.DataModuleCreate(Sender: TObject);
var Reg : TRegistry;
hechodb: Boolean;
begin
hechodb:=true;
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\SOFTWARE\loquesea', false) then
Begin
fBBDD := Reg.ReadString('BBDD');
End
else
Begin
if ((Reg.OpenKey('\SOFTWARE\loquesea', true)) and
(OpenDialog1.Execute)) then
Begin
fBBDD := OpenDialog1.FileName;
Reg.WriteString('BBDD', fBBDD);
End
else
Begin
Showmessage('Debe seleccionar la Base de Datos, se procedera a cerrar la aplicacion');
if (fBBDD='') then
Reg.DeleteKey('\SOFTWARE\loquesea');
hechodb:=false;
Application.Terminate;
End;
End;
if hechodb then
begin
if (Conexion.Connected) then
Conexion.close;
try
Conexion.ConnectionString := bbdd1 + fbbdd + bbdd2;
Conexion.Open;
except
Reg.DeleteKey('\SOFTWARE\loquesea');
Showmessage('La Base de Datos seleccionada es erronea o esta dañada');
reg.Free;
Application.Terminate;
End;
end;
finally
reg.Free;
Conexion.Close;
end;
end;
procedure TDataMod.cambiardb(Sender: TObject);
var Reg2 : TRegistry;
fBBDD2: String;
hechodb2: Boolean;
begin
Reg2 := TRegistry.Create;
hechodb2:= false;
try
Reg2.RootKey := HKEY_LOCAL_MACHINE;
if ((Reg2.OpenKey('\SOFTWARE\loquesea', true)) and
(OpenDialog1.Execute)) then
Begin
fBBDD2:=fBBDD;
fBBDD := OpenDialog1.FileName;
if (Conexion.Connected) then
Conexion.close;
try
Conexion.ConnectionString := bbdd1 + fbbdd + bbdd2;
Conexion.Open;
if (Conexion.Connected) then
begin
Reg2.DeleteValue('BBDD');
Reg2.WriteString('BBDD', fBBDD);
hechodb2:=true;
end;
except
Showmessage('La Base de Datos seleccionada es erronea o esta dañada, se obtendra la anterior');
fBBDD:=fBBDD2;
Reg2.Free;
End;
End
else
Begin
Showmessage('No selecciono ninguna base de datos o aun no existe ninguna Base de datos');
End;
finally
Reg2.Free;
Conexion.Close;
if hechodb2 then
begin
Showmessage('Para seguir trabajando vuelva a Iniciar la Aplicacion');
Application.Terminate;
end;
end;
end;
end.


Por si alguien ve esto recuerdo que debe crear un ConnectionString dentro del TADOConnection y se utiliza asi:

Para llamar desde comprobar si ya hay registrada una base de datos o para la primera vez que se entra:

-Añadimos esta unidad en el uses (en este caso Udatamodule)
-Ponemos donde queramos DataMod.DataModuleCreate(owner);

Para cambiar de base de datos:

-Añadimos esta unidad en el uses (en este caso Udatamodule)
-Pone donde queramos Datamod.cambiardb(owner);

Gracias por su ayuda y espero ayudar a alguien con lo que he puesto

Última edición por Moises22 fecha: 15-12-2005 a las 14:38:01.
Responder Con Cita
  #17  
Antiguo 16-12-2005
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
Muy bien!


Estoy contento que al final solucionaras el problema. Ayer tuve fiesta y por esto no te escribí.

A partir de hoy, tus conexiones a base de datos van a ser pura rutina!

Un saludo

Edu
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


La franja horaria es GMT +2. Ahora son las 00:17:39.


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