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)
-   -   Delphi y las dns (https://www.clubdelphi.com/foros/showthread.php?t=6793)

perrogrun 22-01-2004 11:43:35

Delphi y las dns
 
Ante todo quiero daros un saludo a todos.

Vereis tengo el siguiente problema, tengo un programa que se conecta a una base de datos mysql mediante un ADOConnection1 por medio de una dns de usuario previamente creada en windows.

Funciona perfectamente pero al poner el programa en otro ordenador no funciona ya que la dns no está creada.

¿Cómo puedo hacer para que funcione en otros ordenadores?
¿Hay alguna manera de que al abrir mi programa se cree la dns?

Gracias a todos por vuestra ayuda de antemano

__hector 22-01-2004 14:30:38

Fijate en los valores que se guardan en el registro de windows, en la ruta:

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\

En teoria, puedes crear una nueva conexion ODBC desde codigo, modificando el registro de windows.

Puedes:
Exportar las especificaciones de la llave de tu conexion ODBC a un archivo .reg, y luego instalarlas en la maquina del cliente, o

Chequeas todas las especificaciones que tiene tu conexion ODBC ya creada, y utilizando un objeto TRegistry, creas dichos valores (por codigo) en la maquina donde vas a instalar la app. Ten en cuenta que tambien tienes que crear una entrada con el nombre de la conexion y el tipo en:

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources

Es sencillo, si te pierdes avisanos ;)

perrogrun 22-01-2004 17:59:37

y con InstallShield??
 
He visto en este foro a otras persona que mas o menos les pasa lo mismo y he visto que con este intalador puedes crear las dns. Voy a probar y ya os comento como me ha ido. De todos modos si me puedes facilitar más información sobre los que me has comentado te lo agradecería mucho para estudiarlo este fin de semana. Muchas gracias por todo

__hector 22-01-2004 21:03:12

Si, hay mucha documentacion, puedes verla en la ayuda de delphi, sobre la clase TRegistry.

Es bastante sencillo, incluyes la unit registry en el formulario, te creas un objeto de tipo TRegistry, le asignas el root key con el que vas a trabajar, en su propiedad root, lees los valores con readstring, y si no existe los creas con writestring. En la ayuda, como te comente, puedes ver ejemplos bien ilustra_tivos.

perrogrun 23-01-2004 17:04:09

interesante esto del registro
 
Bueno, bueno, pues si que está interesante esto del registro...

Intentaré hacer la conexion dns haber que tal...

De todos modos he encontrado dos funciones muy buenas para leer y escribir en el registro. Os pongo aquí el linkhttp://www.latiumsoftware.com/es/delphi/00004.php espero que os sirvan igual que me han servido a mi. Ya os contaré cómo me ha ido.


Muchiiiiiiiisimas gracias

perrogrun 26-01-2004 08:37:27

Parece que el enlace no funciona
 
Como parece que el enlace no funciona os pongo aquí las dos funciones:


Para leer el registro:

function GetRegistryData(RootKey: HKEY; Key, Value: string): variant;
var
Reg: TRegistry;
RegDataType: TRegDataType;
DataSize, Len: integer;
s: string;
label cantread;
begin
Reg := nil;
try
Reg := TRegistry.Create(KEY_QUERY_VALUE);
Reg.RootKey := RootKey;
if Reg.OpenKeyReadOnly(Key) then begin
try
RegDataType := Reg.GetDataType(Value);
if (RegDataType = rdString) or
(RegDataType = rdExpandString) then
Result := Reg.ReadString(Value)
else if RegDataType = rdInteger then
Result := Reg.ReadInteger(Value)
else if RegDataType = rdBinary then begin
DataSize := Reg.GetDataSize(Value);
if DataSize = -1 then goto cantread;
SetLength(s, DataSize);
Len := Reg.ReadBinaryData(Value, PChar(s)^, DataSize);
if Len <> DataSize then goto cantread;
Result := s;
end else
cantread:
raise Exception.Create(SysErrorMessage(ERROR_CANTREAD));
except
s := ''; // Deallocates memory if allocated
Reg.CloseKey;
raise;
end;
Reg.CloseKey;
end else
raise Exception.Create(SysErrorMessage(GetLastError));
except
Reg.Free;
raise;
end;
Reg.Free;
end;

Para llamar a esta funcion por ejemplo:
ShowMessage(GetRegistryData(HKEY_LOCAL_MACHINE,
'\SOFTWARE\ODBC\ODBC.INI\pelicula', 'SourceDB'));





Para escribir en el registro:

procedure SetRegistryData(RootKey: HKEY; Key, Value: string;
RegDataType: TRegDataType; Data: variant);
var
Reg: TRegistry;
s: string;
begin
Reg := TRegistry.Create(KEY_WRITE);
try
Reg.RootKey := RootKey;
if Reg.OpenKey(Key, True) then begin
try
if RegDataType = rdUnknown then
RegDataType := Reg.GetDataType(Value);
if RegDataType = rdString then
Reg.WriteString(Value, Data)
else if RegDataType = rdExpandString then
Reg.WriteExpandString(Value, Data)
else if RegDataType = rdInteger then
Reg.WriteInteger(Value, Data)
else if RegDataType = rdBinary then begin
s := Data;
Reg.WriteBinaryData(Value, PChar(s)^, Length(s));
end else
raise Exception.Create(SysErrorMessage(ERROR_CANTWRITE));
except
Reg.CloseKey;
raise;
end;
Reg.CloseKey;
end else
raise Exception.Create(SysErrorMessage(GetLastError));
finally
Reg.Free;
end;
end;


Para llamar a esta funcion:

SetRegistryData(HKEY_LOCAL_MACHINE,
'\SOFTWARE\ODBC\ODBC.INI\pelicula',
'BackgroundFetch', rdString, 'Sí');


La franja horaria es GMT +2. Ahora son las 00:18:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi