Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Seoane nadie ha podido (https://www.clubdelphi.com/foros/showthread.php?t=42309)

erasmorc 11-04-2007 14:12:08

Seoane nadie ha podido
 
Buenas dias,

Estoy diseñando una aplicacion en delphi 7, con componentes ado y sql 2000.
Tengo la necesidad de que en esa aplicacion que tengo, poder instalarla en servidores que nunca haya corrido anteriormente, como es sabido el componente adoconection se configura en tiempo de diseño, ahi elejimos el proveedor, el servidor, user, pass, etc. pero cuando queremos correrla en otro servidor se hace necesario compilar el programa conectado a ese servidor, ya saben todo lo que esto conlleva, ademas de que no es muy profesional que digamos tener que compilar la aplicacion en cada servidor que deseas instalarla. Lo que me gustaria hacer es que la aplicacion localize el servidor o servidores de sql que haya en la red y poder elegir al que me conectare, claro esta se supone que ya la base de datos debera estar atachada a este servidor y entonces a partir de ahi generar el string de coneccion que se le pasara al adoconection.

Ya lo he hecho con archivos de configuracion .ini y funciona, pero para esto debo primero haberme conectado por lo menos la primera vez para poder obtener el string de coneccion y colocarlo en el archivo ini.

Gracias por tu ayuda.

seoane 11-04-2007 14:31:02

Hola erasmorc, no es que no quiera ayudarte, es simplemente que no tengo ni idea de lo que me estas hablando. No se como has llegado a la conclusión de que yo podría darte una solución a tu problema, quizá por mi numero de mensajes en el foro, pero si te fijas bien, de todos ellos creo que solo un par han sido relacionados con bases de datos y fueron para pedir ayuda :(

Por otro lado, aquí si hay auténticos maestros manejando bases de datos y dirigiéndote directamente a mi, estas limitando la ayuda que puedes recibir. Puede que alguno de ellos sepa la respuesta, pero que ni siquiera lea este hilo ....

erasmorc 11-04-2007 14:40:50

Buenos dias,

Lo que pasa es que relaciono mas el tema con programacion que con BD, y me parece que una vez colocaste algo en el foro en donde podias a traves de sockets buscar el servidor que estuviera conectado a la red. He tratado de localizar ese hilo pero no he podido, pero de todas formas muchas gracias por contestar la pregunta, voy a colocar el hilo en el foro de BD a ver que pasa. Cuidate y muchas gracias.

Slds,
FRC

seoane 11-04-2007 15:05:05

Cita:

Empezado por erasmorc
y me parece que una vez colocaste algo en el foro en donde podias a traves de sockets buscar el servidor que estuviera conectado a la red.

Creo que te refieres a este hilo
http://www.clubdelphi.com/foros/showthread.php?t=40113

Neftali [Germán.Estévez] 11-04-2007 15:06:03

Cita:

Empezado por erasmorc
...tengo, poder instalarla en servidores que nunca haya corrido anteriormente, como es sabido el componente adoconection se configura en tiempo de diseño, ahi elejimos el proveedor, el servidor, user, pass, etc

Que yo sepa nada te impide rellenar esa cadena en ejecución.

Cita:

Empezado por erasmorc
...ademas de que no es muy profesional que digamos tener que compilar la aplicacion en cada servidor que deseas instalarla.

No es que no sea profesional, es que es del todo innecesario y si a alguien se le pasa por la cabeza tal cosa, que se ponga a dormir unas cuantas horas y luego lo vuelva a pensar de nuevo....;)

En cuanto a la lista de servidores de una red, hace algun tiempo vi un procedimiento que los buscaba, pero no le logrado encontrarlo.
Revisa esta web, donde puedes encontrar una DLL (servidor COM) que te los devuelve y el correspondiente código en VB. Puedes usarlo directamente o intentar traducirlo.

Otra opción es mirar este artículo de Delphi3000, que muestra cómo hacerlo en Delphi. Aunque es una web de pago, antiguamente podías registrate y acceder a algunos artículos de forma gratuíra; Ahora no se cómo estará el tema...

Neftali [Germán.Estévez] 11-04-2007 15:09:10

A esta me refería.

erasmorc 11-04-2007 15:41:14

Gracias Neftali voy a probar de inmediato, pero segun dice el articulo es exactamente lo que necesito realizar.

Slds,
FRC

poliburro 11-04-2007 16:20:59

Cita:

Empezado por erasmorc
Buenas dias,
como es sabido el componente adoconection se configura en tiempo de diseño, ahi elejimos el proveedor, el servidor, user, pass, etc. pero cuando queremos correrla en otro servidor se hace necesario compilar el programa conectado a ese servidor

Estas sacando conclusiones apresuradas mi amigo, Para eso existen los archivos UDL, que te permiten configurar las conexiónes sin necesidad de usar delphi para recompilar tu aplicación.

Que no sepas hacer algo, no significa que esto sea imposible.


Por cierto, esto debería ir en conexión a base de datos o Ms Sql Server, Digo es mi opinión.

erasmorc 11-04-2007 16:32:15

Buenos dias,

Ya que tocas el tema de los archivos udl y como bien dices que el hecho que una persona no sepa como hacer no quiere decir que no se pueda, te agradeceria mucho que me explicaras o pasaras un ejemplo de como se conecta. Te comento que se cuales son los archivos UDL que puedes configurar la conexion sin compilar desde delphi, hasta ahi vamos bien, pero a partir de ahi como le digo a mi componente que utilize este achivo udl para conectarse no he podido hacerlo, lo he intentado de las siguientes formas, en el conection string del adoconection coloco file name = 'c:\prueba\ventas.udl'
'file name = c:\prueba\ventas.udl' , file name = "c:\prueba\ventas.udl", etc,etc. Te agradeceria cualquier ayuda.

Slds,
FRC

pepon386 11-04-2007 17:20:02

Lo único que necesitas para que tu aplicación funcione correctamente es en el evento 'OnWillConnect' del componente TADOConnection asignar el valor de la cadena de conexión a la variable 'ConnectionString':

Código Delphi [-]
procedure TDMMain.ADOConnectionWillConnect(Connection: TADOConnection;
  var ConnectionString, UserID, Password: WideString;
  var ConnectOptions: TConnectOption; var EventStatus: TEventStatus);
begin
  ConnectionString := GetConnectionString;
  EventStatus := esUnwantedEvent;
end;
 
function TDMMain.GetConnectionString;
begin
  Result := MiCadenaDeConexión;
end;

erasmorc 11-04-2007 17:23:41

Buenos dias,

Y en que momento utilizo la configuracion guardada en el archivo udl???


Slds,
FRC

poliburro 11-04-2007 18:08:27

Mi amigo, creo que de repente una búsqueda en el foro te sería bastante útil:

aquí un post donde se presentaba tu misma duda con su respectiva solución:

http://www.clubdelphi.com/foros/showthread.php?t=34865

Ahora que te comento, un archivo UDL es en sí, un Ini común y corriente, así que podrias crear una función del tipo:

Código Delphi [-]
With TIniFile.Create(ArchivoUdl) Do
  Result := 'provider=' + ReadString('oledb','Provider','');

Una vez que tienes la cadena de conexión, solo debes asignarla a la propiedad Conexión String de tu objeto conexión.

bueno, pues suerte

erasmorc 11-04-2007 18:25:20

Buenos dias,

No quiero crear el archivo .ini, no me interesa hacerlo de esa manera, se supone que en el conexion string del componente ado debo poder especificar el archivo de configuracion udl al que quiero hacer referencia, pero no me interesa crear el archivo ini.

Y si he buscado en el foro, lo que pasa que el motor de busquedas funciona en base las palabras que coloques y estas a su vez dependen de como a cada quien se le ocurra nombrar su tema.

Slds,

dec 11-04-2007 18:37:39

Hola,

Cita:

Empezado por erasmorc
Y si he buscado en el foro, lo que pasa que el motor de busquedas funciona en base las palabras que coloques y estas a su vez dependen de como a cada quien se le ocurra nombrar su tema.

Por eso conviene titular los Hilos lo más descriptivamente posible, porque ayuda no poco a la hora de utilizar el buscador de los Foros.

Pero todos debemos aplicarnos el cuento, incluso tú, si me lo permites, puesto que "Seoane nadie ha podido" no parece un título muy apropiado...

argote 11-04-2007 18:38:10

Erasmoc
 
Para obtener el listado de todos los servidores de MS SQL, registrados en tu network, debes utilizar el procedimiento almacenado sp_helpserver.
Si utilizas un componente TADOQuery y en la sentencia escribes:
exec sp_helpserver
podrás obtener el listado de los servidores MS SQL y de los LINKED SERVERS. Acá está un ejemplo de como sacar de este componente el listado.
Código Delphi [-]
TForm1.Button1Click(Sender: TObject);
var
  cad : string;
begin

  ADOQuery1.Open;
  ADOQuery1.First;
  while not ADOQuery1.Eof do
    begin
      cad := cad + ADOQuery1.Fields[0].AsString + #13#10;
      ADOQuery1.Next;
    end;
  ShowMessage(cad);
end;

Caral 11-04-2007 18:41:20

Hola
Bueno erasmorc, la verdad tienes y no razon en que el componente adoconnection configura la direccion de la base de datos en tiempo de ejecucion, por que digo tienes y no, porque en realidad la conexion la necesitas para hacer el programa, no necesariamente para distribuirlo o ejecutarlo.
Si usas un datamodule y un archivo .ini, puedes copiar la ruta que usa el adoconection y cambiarla en el ini muy facilmente.
Un ejemplo con mysql:
En el datamodule:
Código Delphi [-]
procedure TDataModule1.DataModuleCreate(Sender: TObject);
Var BaseDeDatos, ConStr : String;
    IniFile: TIniFile;
begin
 // Obtiene la ruta y el nombre de la base de datos
   IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'Archivo.ini');
   BasedeDatos := IniFile.ReadString('BD','Path','');
   If BasedeDatos = '' then ShowMessage('Error al cargar Base de Datos');
   ConStr := 'Provider=MSDASQL.1;'+
             'Data Source='+BaseDeDatos+';'+
             'Persist Security Info=True';//'+
         //    'Password=admin1';
   AC1.ConnectionString := ConStr;
   AC1.Open;
end;
Como veras, al iniciar el datamodule, este busca primero el archivo.ini que contiene lo que quieras, en mi caso el nombre de la base de datos, pero puedes ponerle toda la direccion si es el caso asi:
Archivo.ini:
Cita:

[BD]
Path="Basedatos"
[Logon]
Auto="NO"
Login=""
Pass=""
Al distribuir el ejecutable, se distribuye el archivo.ini, que lo puede modificar cualquiera facilmente.
Bueno espero te sirva de otro ejemplo.
Saludos

poliburro 11-04-2007 18:51:34

Cita:

Empezado por erasmorc
Buenos dias,

No quiero crear el archivo .ini, no me interesa hacerlo de esa manera, se supone que en el conexion string del componente ado debo poder especificar el archivo de configuracion udl al que quiero hacer referencia, pero no me interesa crear el archivo ini.

Hombre, :|, creo que no me entendiste, el archivo de configuración UDL, es en realidad un archivo INI, si tu abres con el notepad tu archivo UDL encontraras que su estructura es la de un INI.

Oviamente la ventaja del UDL es que al ser ejecutado te levanta el asistente de conexión de ADO. Pero internamente es un INI común y corriente

Neftali [Germán.Estévez] 11-04-2007 19:12:38

Cita:

Empezado por argote
Si utilizas un componente TADOQuery y en la sentencia escribes:
exec sp_helpserver

Esta no la conocía... :p

Caral 11-04-2007 19:26:15

Hola
Con esto: exec sp_helpserver
A mi me quedan dudas, no me funciona.
Si conecto el adoquery, buscara una tabla con ese nombre,
Si por el contrario no lo conecto, me dira que no tengo conexion.
Como se hace?, seria interesante saberlo.
Saludos

erasmorc 11-04-2007 19:42:31

Buenas tardes,

Primero que nada gracias a Poliburro, Neftali, Argote y Caral por el interes en el hilo y por sus respuestas atinadas.

Quisiera darle la razon a Neftali en cuanto a la forma de nombrar el hilo, lo nombre asi porque alguna vez vi un codigo publicado por seoane que hacia algo parecido y entonces le pase un mensaje pero no recibi respuesta y pense en esta forma para hacerle llegar el mensaje.

Por otro lado la respuesta de Caral de los archivos .ini conozco el procedimiento y no es realmente lo que quiero.

Entre las respuestas de Poliburro, Neftali y Argote puedo hacer una combinacion y lograr el objetivo deseado, les dejo saber el resultado, de nuevo muchas gracias por el interes.

Slds


La franja horaria es GMT +2. Ahora son las 19:27:54.

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