PDA

Ver la Versión Completa : Conectar varias Bases de Datos con Server DataSnap


gcaffe
19-12-2010, 00:44:37
Hola amigos:
Agradecería me den sus opiniones o consejos sobre el siguiente tema.
Tengo una aplicación Cliente-Servidor funcionado perfectamente, el programa Servidor, instalado en el Servidor donde está la Base de Datos MSSQL, da servicio a los clientes accediendo a una Base de Datos (BD). Ahora se me propone que el programa pueda atender a varias empresas y como requisito necesario es que cada una de ellas tenga, físicamente, su propia BD. Y es aquí donde se me presenta el problema para seleccionar la mejor estrategia a implementar para atender a varias BD teniendo un solo Programa Servidor (SRV). Con el programa cliente no hay mayor problema en decidir que BD se debe usar.
Considerando que en el SRV hay un TSQLConnection donde se indica en su propiedad DataBase = DB1, las alternativas que estoy estudiando son las siguientes:
1. Duplicar el SRV, establecer otro puerto de conexión, cambiando la conexión TSQLConnection para que use otra BD y todos los componenetes dbExpress para que apunten al nuevo TSQLConnection . Pero aquí tendría que tener tantas copias de SRV ejecutándose en el Servidor como empresas hubiera además del problema de mantenimiento de los procedimientos almacenados (PROC) en las respectivas BD.
2. Duplicar el Data Module remoto del SRV, y modificar lo necesario en el TSQLConnection del nuevo Data Module según el punto 1. Aquí tendría una sola ejecución de SRV, siendo necesario hacer esta duplicación por cada nueva empresa que se desee incorporar.
3. Dejar el SRV tal como está, siendo necesario modificar todos los PROC, incluyendo como parámetro el nombre de la BD y tabla la cual el PROC atiende teniendo que armar la sentencia SQL en una variable para su ejecución final, algo así como el siguiente código ejemplo:

DECLARE @DBase varchar(20);
DECLARE @dbTabla25 varchar(50);
DECLARE @SQL nvarchar(MAX);
SET @DBase = 'Ges120.dbo.';
SET @dbTabla25 = @DBase+'Tabla25';
SET @SQL = 'SELECT * FROM '+@dbTabla25;
EXECUTE SP_EXECUTESQL@SQL;

Con esta opción tendría que hacer una modificación importante en los PROC y en aquellos que tengo escritos en el programa cliente, pero la ventaja sería la del mantenimiento posterior y no importaría la cantidad de empresas.
No me he decidido todavía por ninguna de ellas, por eso recurro a ustedes por si me pueden indicar alguna otra alternativa que sea segura, su implantación sea más sencilla y el mantenimiento posterior normal.
Muchas gracias.

manuc
24-12-2010, 13:24:57
Hola,

¿cómo tienes programado el servidor? ¿DataSnap? ¿utilizas Borland Socket Server? ¿socket connection)

Si utilizas socket connection, puede implementar un procedimiento remoto en el servidor y que reciba un parámetro indicándole a qué base de datos se ha de conectar el tSQLConnection.

Si es así, te podría indicar cómo hacerlo.

Un saludo.

gcaffe
09-01-2011, 00:47:30
Hola Manuc:

Mi conexión es DataSnap, uso procedimientos remotos a través del TsqlServerMethod para otros procesos. No sé como hacer para cambiar la conexión a la Base de Datos, si me puedes ayudar te lo agradeceré.
Pero también me queda la duda, ¿qué pasaría si un usuario usa la BD1 y otro cambia a la BD2 teniéndo un solo TSQLConnection?

Saludos

manuc
10-01-2011, 10:14:22
Hola gcaffe,

Divido las respuestas, para que no se haga muy pesao. :-)

Pero también me queda la duda, ¿qué pasaría si un usuario usa la BD1 y otro cambia a la BD2 teniéndo un solo TSQLConnection?

Depende de cómo hayas creado la capa SQL (la que se ejecuta en el servidor). Lo normal, es que sea multi-instancia. Esto quiere decir, que cada vez que conectar al servidor para hacer uso de tu capa SQL, se levanta una instancia, que no es más que una copia del original.

Si conectas dos usuarios al mismo tiempo, realmente en el servidor se deben estar levantando dos instancias de tu capa SQL y cada una de ellas tendrá una copia del componente SQLConnection. De tal forma que puedes manipular las propiedades del SQLConnection, sin que afecte al resto de instancias.

manuc
10-01-2011, 10:41:56
Al segundo tema:

No sé como hacer para cambiar la conexión a la Base de Datos...

Intentaré describirte el proceso paso a paso:

Crear el procedimiento remoto.

En la Capa SQL o Capa Intermedia: Ir al menú View -> type Library: se abrirá un cuadro de dialogo, con la estructura de tu capa SQL.
A la izquierda, debe aparecer un árbol. Debes seleccionar el item que representa la "interface", que es el que tiene como una piruleta roja.
Al marcar este "item", se han de habilitar algunos de los botones superiores. Pulsa "New Method" y teclea el nombre para tu procedimiento remoto. Dale un nombre sencillo, sin mayúsculas ni caracteres raros.
Selecciona el método que acabas de crear en el árbol de la izquierda. A la derecha, debes de encontrar un panel con varias páginas. Selecciona la página que indica "Parameters" y pulsas en el botón "Add" que encontrarás en la parte inferior.
En la columna "name" introduce el nombre de tu parámetro (por ejemplo: basededatos)
En la columna "Type" introduce "BSTR *" (sin las comillas).
En la columna "modifier" introduce "[out, retval]" (sin las comillas).
En la barra de botones, pulsa sobre el botón "Refresh implementation".
Guarda los cambios.
En la unidad donde tienes los componentes de conexión, tienes que localizar el método que acabas de crear e introducir el código que quieres ejecutar, en la implementación del mismo.
Guarda los cambios y RECOMPILA la Capa SQL o Capa Intermedia.


Ya tendríamos listo la implementación del procedimiento.

Llamar al procedimiento remoto.

Mediante el SocketConnection llamamos al método remoto: TSocketConnection.AppServer.nombre-de-tu-método-remoto(nombre-base-de-datos-a-conectar)




Esto sería todo.

Yo tengo Delphi 6. Imagino que en versiones posteriores puede ser que haya cambiado algún icion o alguna opción.

Puede parecer un tanto "complicado", pero hayas hecho 200 o 300 se le coge el hilo. :D

Si tienes alguna duda, comentamelo sin problemas.

Espero que se entienda.

Un saludo.

Casimiro Notevi
22-05-2016, 01:55:09
Por favor, lee nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), gracias por tu colaboración :)
Buenas noches tengo un duda,
no se como hacer la conexión datasnap en el lado del servidor para varios clientes y conexión a distintas bases de datos.
Tengo la función en el servidor que modifica la conexión a la base de datos y donde el cliente ya la modifico pero el problema es que si la modifico jodo al que este conectado a otra
¿ COMO PUEDO HACER PARA QUE CADA CLIENTE NO SE CREEN CONFLICTOS ENTRE ELLOS ?
SALUDOS