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 30-05-2014
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 19
mblascog Va por buen camino
Obtener ado connectionstring

Buenas,
He creado una aplicación que accede a una base de datos Access vía ODBC.
He creado un DSN de usuario, y he cargado en la propiedad ConnectionString la cadena de connexión:

Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Iris;DBQ=C:\OMH\Habitatge_Iris.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"


Ahora que ya he acabo el programa y funciona en mi pc, lo quiero instalar en el servidor de la empresa. Al igual, creo el DSN de usuario en el servidor, y en ConnectionString cambio la ruta de la base de datos. Creía que así funcionaría, pero da el siguiente error:

[Microsoft][Controlador ODBC Microsoft Access]'desconocido' no es una ruta de acceso válida. Asegúrese de que la ruta está escrita correctamente y que está conectado al servidor donde se encuentra el archivo

La ruta es correcta, seguro. Es una unidad de red.
He buscado si existe alguna función que a partir del nombre de DSN de usuario te devuelva la cadena de conexión, pero no he encontrado nada.

Alguien puede guiarme un poco.
Gracias.
Responder Con Cita
  #2  
Antiguo 30-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola mblascog.

Intenta de este modo:
Código Delphi [-]
...
implementation

uses Registry;

function IsWOW64: Boolean;
type
  LPFN_ISWOW64PROCESS = function(hProcess: THandle; var Wow64Process: BOOL): BOOL; stdcall;
var
  fnIsWow64Process: LPFN_ISWOW64PROCESS;
  bIsWOW64: BOOL;
begin
  Result:= False;
  fnIsWow64Process:= LPFN_ISWOW64PROCESS(GetProcAddress(GetModuleHandle('kernel32'), 'IsWow64Process'));
  if Assigned(fnIsWow64Process) then
  begin
    bIsWow64:= False;
    if fnIsWow64Process(GetCurrentProcess(), bIsWOW64) then
      Result:= bIsWOW64;
  end;
end;

function GetConnectStrFromDSN(const DSNStr: string): string;
const
  KEY_WOW64_64KEY = $0100;
begin
  Result:= '';
  with TRegistry.Create(KEY_READ + KEY_WOW64_64KEY * Integer(IsWOW64)) do
  try
    RootKey:= HKEY_LOCAL_MACHINE;
    if OpenKey('\SOFTWARE\ODBC\ODBC.INI', False) then
    begin
      Result:= ReadString(DSNStr);
      CloseKey;
    end;
  finally
    Free;
  end;
end;

Ej. llamada:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetConnectStrFromDSN('Iris'));
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 30-05-2014 a las 14:11:47.
Responder Con Cita
  #3  
Antiguo 30-05-2014
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 19
mblascog Va por buen camino
Buenas Ecfisa,
Gracias por tu código. Lo he probado y me devuelve un string en blanco.
He mirado en el Registro si existía la clave y la he encontrado en HKEY_CURRENT_USER en lugar de HKEY_LOCAL_MACHINE. Lo he cambiado, pero me sigue devolviendo el string en blanco.
Puede tener algo que ver en 32 o 64 bits?

Gracias por tu ayuda.
Responder Con Cita
  #4  
Antiguo 30-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola mblascog.
Cita:
Empezado por mblascog Ver Mensaje
Buenas Ecfisa,
Gracias por tu código. Lo he probado y me devuelve un string en blanco.
He mirado en el Registro si existía la clave y la he encontrado en HKEY_CURRENT_USER en lugar de HKEY_LOCAL_MACHINE. Lo he cambiado, pero me sigue devolviendo el string en blanco.
Puede tener algo que ver en 32 o 64 bits?
Es lo mas probable ya que si el SO es de 64 bits hay registros afectados por WOW64 (entre los que figura el que tratamos).

Si todo transcurre en un entorno de 32 bits el código quedaría de este modo:
Código Delphi [-]
function GetConnectStrFromDSN(const DSNStr: string): string;
begin
  Result:= '';
  with TRegistry.Create(KEY_READ) do
  try
    RootKey:= HKEY_LOCAL_MACHINE;
    if OpenKey('\SOFTWARE\ODBC\ODBC.INI', False) then
    begin
      Result:= ReadString(DSNStr);
      CloseKey;
    end;
  finally
    Free;
  end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 30-05-2014
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 19
mblascog Va por buen camino
Gracias Daniel,
Pero me sigue devolviendo una cadena en blanco.
Quizás me estoy complicando la vida. La cadena de ConnectionString la consigo a partir de la propiedad ConnectionString del componente TQuery. Al hacer click me aparece la pantalla para construir la cadena, seleccionas el origen de datos (DSN de usuario) y te la genera.
Hay alguna manera de conseguir, como sea, esta cadena en Windows Server 2003, es que no me importa ponerla a mano y dejo de complicarme la vida?.

Muchas gracias por tu ayuda.

Última edición por mblascog fecha: 30-05-2014 a las 19:00:15.
Responder Con Cita
  #6  
Antiguo 30-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola mblascog.

No sé si entendí lo último que comentas pero si solo se trata de obtener la ruta de la cadena que previamente se generó en el query, creo que podrías hacer:
Código Delphi [-]
uses StrUtils;

function GetPathFromQry(const qStr:string): string;
var
  p1,p2: Integer;
begin
  Result:= '';
  p1:= Pos('DBQ=', qStr) + Length('DBQ=');
  p2:= PosEx(';', qStr , p1);
  Result := Copy(qStr ,p1, p2-p1);
end;

Ej. de llamada:
Código Delphi [-]
  ShowMessage(GetPathFromQry(ADOQuery1.ConnectionString));
De la cadena ejemplo de tu mensaje se obtendría: C:\OMH\Habitatge_Iris.mdb

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 30-05-2014 a las 20:04:18. Razón: corregir nombre de función
Responder Con Cita
  #7  
Antiguo 30-05-2014
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 19
mblascog Va por buen camino
Gracias Ecsisa,
Creo que no me expliqué bien.
He hecho un programa que accede a una base de datos Access.
Para hacer el programa me he copiado la base de datos a mi pc y desde él he trabajado.
Ahora que he acabado el programa, quiero copiarlo al servidor de la empresa, donde está la base de datos Access, por lo que tengo que cambiar el CconnectionString.
Pensaba que cambiando la ruta de la base de datos (DQQ) funcionaría, pero me da el error que comenté en el primer mensaje. Y la verdad es que ya no sé qué hacer.

Gracias
Responder Con Cita
  #8  
Antiguo 30-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola mblascog.

El que te debe la disculpa soy yo que entendí cualquier cosa...

Una consulta que con seguridad ya te hayas planteado, ¿ Comparaste las cadenas de conexión de tu equipo con alguna de las existentes en el servidor como para darte una idea en que difieren ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 30-05-2014
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 19
mblascog Va por buen camino
Buenas Ecfisa,
Todas la conexiones las he creado yo misma, desde Herramientas Administrativas - Orígines de Datos ODBC - DSN de usuario.
Por esto pensaba que en sólo cambiar la ruta debería funcionar, pero no.
En mi pc, como tengo instalado Delphi, obtengo la cadena de conexión desde el propio componente TADOquery, pero en el servidor no está instalador Delphi, por lo que no sé cómo generarla.
Si existiera una alguna manera de obtenerla me sería suficiente.

Gracias.

Última edición por mblascog fecha: 30-05-2014 a las 21:38:57.
Responder Con Cita
  #10  
Antiguo 01-06-2014
mblascog mblascog is offline
Miembro
 
Registrado: may 2006
Posts: 131
Poder: 19
mblascog Va por buen camino
Buenas,
He visto que el problema lo tengo por tener ubicada la base de datos en una unidad lógica correspondiente a un segundo disco del ordenador donde ejecuto. Si la copio a la c:\ y cambio la ruta del DSN funciona perfectamente.
Lo tengo así, si alguien ve por donde anda el error le estaré muy agradecida.

Query.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Alicia;DBQ=F:\DATOS\Alicia\Access\Habitatge_Alicia.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"'

Gracias.

Última edición por mblascog fecha: 01-06-2014 a las 23:05:12.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ADO-Access. Configurar "ConnectionString" en pc del cliente durante la insalación. Wonni Conexión con bases de datos 9 17-05-2007 18:50:51
Ocultar ConnectionString TADOConnection IsidoroM Conexión con bases de datos 4 25-05-2006 17:01:59
ADO y su Propidad ConnectionString !!! Ledian2006 Conexión con bases de datos 3 10-01-2006 20:50:39
Obtener mi ip de la PC jam888 Varios 3 06-04-2005 21:32:33
ERROR: Missing connection or ConnectionString!!!!!!!! DarkByte Conexión con bases de datos 3 09-09-2004 15:28:42


La franja horaria es GMT +2. Ahora son las 12:35:58.


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