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)
-   -   Conexion con Access (https://www.clubdelphi.com/foros/showthread.php?t=28169)

Moises22 12-12-2005 13:42:52

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 ;)

epuigdef 12-12-2005 15:38:01

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

Moises22 13-12-2005 09:36:57

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

epuigdef 13-12-2005 11:31:23

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 OLEDB:Database 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

Moises22 13-12-2005 14:00:31

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

epuigdef 13-12-2005 15:05:00

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

Moises22 14-12-2005 09:39:28

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

epuigdef 14-12-2005 09:42:35

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

Moises22 14-12-2005 10:02:19

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 ?

Moises22 14-12-2005 11:52:30

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 ?????

epuigdef 14-12-2005 13:19:54

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

Moises22 14-12-2005 13:52:12

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.

epuigdef 14-12-2005 14:56:47

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

Moises22 14-12-2005 20:17:40

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

Moises22 15-12-2005 09:45:38

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

Moises22 15-12-2005 14:34:33

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 ;)

epuigdef 16-12-2005 07:59:39

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


La franja horaria es GMT +2. Ahora son las 19:46:10.

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