PDA

Ver la Versión Completa : Conexión dinámica a base de datos .mdb


grandzon
06-08-2014, 17:08:33
Hola tod@s.

Una vez más solicito ayuda de los expertos del foro, estoy desarrollando una aplicación en Delphi XE3 en la que deseo que al iniciar por primera vez si no encuentra la ruta a la base de datos, que guardo en el Registro Windows, me pregunte por dicha ruta usando un TOpenDialog. La función que uso para grabar la ruta en el Registro lo hace perfectamente, la que uso para leerla... no estoy seguro lo haga tan bien. El principal problema que he notado es que me borra la ruta de acceso del Registro al cerrar la aplicación, lo he notado porque: 1-inicio la aplicación, me pregunta por la ruta de la Base de Datos y se la especifico luego ejecuto el RegEdit y la ruta está ahí, 2-cierro la aplicación luego entro a RegEdit nuevamente y la ruta ya no está.

Este es el código que estoy usando en el módulo de datos (donde tengo alojado un TADOConnection) en el evento OnCreate:

procedure TDataModule1.DataModuleCreate(Sender: TObject);
var
rutaBD:string;
conexion:widestring;
begin
rutaBD:=regread('Softwate\Proyecto6527', 'Base de Datos', ''); //tratar de leer la ruta a base de datos

if not (fileexists(rutaBD)) then //si no existe la ruta crearla usando como base el cuadro de diálogo
begin
application.MessageBox('Por favor localice la base de datos','No tengo base de datos');
if OpenDialog1.Execute() then rutaBD:=OpenDialog1.FileName; //asignar la ruta del cuadro de diálogo a la rutaBD
conexion:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
+rutaBD+';Persist Security Info=False';
ADOConnection1.ConnectionString:=conexion;
try
ADOConnection1.Open();
regwrite('Base de Datos', rutaBD);
except on e:exception do
showmessage('Hubo un error al conectarse a la base de datos');
end;
end;
end;

Estas son las funciones RegRead y RegWrite


function regwrite(nombre, valor: string): boolean;
var
registro: tregistry;
begin
registro:= tregistry.Create;
result:= true;
with (registro) do begin
try
if (openkey('\software\Proyecto6527', true)) then
writestring(nombre, valor)
else
result:= false;
finally
free;
end;
end;
end;

function regread(ruta, nombre, valor: string): string;
var
registro: tregistry;
begin
registro:= tregistry.Create;
result:= '';
with (registro) do begin
try
if (openkey(ruta, true)) then begin
result:= readstring(nombre);
if (result = '') then begin
regwrite(nombre, valor);
result:= valor;
end;
end;
finally
free;
end;
end;
end;

...y este es el orden de creación de los componentes en el Código Fuente del Proyecto

Application.CreateForm(TDataModule1, DataModule1);
Application.Initialize;
Application.MainFormOnTaskbar := True;

Si alguien pudiera decirme qué estoy haciendo mal (le he dado mil vueltas a esto y no encuentro qué sea), o sugerirme una manera más sencilla y efectiva de hacerlo se lo agradecería bastante.

Neftali [Germán.Estévez]
06-08-2014, 17:52:03
Es posible que si usas la misma clave para leer y para escribir funcione...



...
begin
rutaBD:=regread('Softwate\Proyecto6527', 'Base de Datos', ''); //tratar de leer la ruta a base de datos
...







...
if (openkey('\software\Proyecto6527', true)) then
writestring(nombre, valor)
...



...Softwate <> Software...

:D:D

grandzon
06-08-2014, 18:20:21
Gracias por hacerme notar esa falta hermano, pero luego de corregirla ahora me da 'Authentication failed'

Neftali [Germán.Estévez]
07-08-2014, 09:52:59
¿Tu Base de Datos tiene contraseña?
La mía sin contraseña (la que viene de pruebas con Delphi) ha conectado sin problemas.
Si la Base de Datos tiene contraseña, debes cambiar la cadena de conexión.

grandzon
10-08-2014, 23:46:17
Gracias por sus aclaraciones Neftali, el problema era justamente ese "la contraseña" jajaja... la solución es que en lugar de especificarla en la propiedad "password" debí hacerla en la propiedad "Jet OLEDB:Database password"... hasta un poco de vergüenza me dio, pero como dicen "no hay preguntas tontas solo tontos que no preguntan" :p, gracias de nuevo