Usuario
Conectar base de datos SQL con c# desde distintas redes

Pregunta
-
Muy buenas a tod@s!
He realizado un proyecto en c# desde el cual se accede a una base de datos que se encuentra en mi propio ordenador. Cuando ejecuto la aplicación desde mi ordenador funciona sin problema, incluso creando una máquina virtual (misma red) obtengo buenos resultados.
Sin embargo, cuando ejecuto la aplicación desde un ordenador conectado a otra red no me funciona. Entiendo que el problema está en la forma de indicar la conexión. Mi cadena de conexión es la siguiente:
SqlConnection conexion = new SqlConnection("Data source= ip, 1433; Initial Catalog= BBDD; User Id = user; Password = pass; Integrated Security=false");
He leído muchos foros relacionados con este problema y he configurado todos los puertos, firewall, etc. para poder tener acceso.
¿Alguien tiene alguna idea de cuál puede ser el problema?
Muchas gracias!
Todas las respuestas
-
Tal como tienes la cadena de conexión, debería funcionar desde cualquier red, a condición de que exista conectividad con la tuya. Cerciórate de que la dirección IP que indicas en la cadena de conexión es alcanzable desde la máquina en la que ejecutas el programa, no vaya a ser que estés usando una IP privada detrás de un NAT o algo por el estilo. Y también, lógicamente, que el puerto 1433 no esté bloqueado por algún hardware de red (tal como un firewall) interpuesto entre los dos equipos.
En resumidas cuentas, el problema no está, como suponías, en la forma de indicar la conexión, que es correcta, sino que es un problema de infraestructura de red y administración de sistemas.
-
hola
>>cuando ejecuto la aplicación desde un ordenador conectado a otra red no me funciona.
validaste si esas redes se ven entre si? si realizas un ping de una red a la ip de otra responde ?
Si te conectas a la db que esta en el sql server de la otra red usando el Management Studio, puedes conectarte ?
Recuerda que por defecto Sql Server no permite conexiones remotas, sino que debes habilitarlo, tambien podria ser el firewall de windows
Enable Remote Connection on SQL Server 2008 Express
esto aplica a sql server 2008 o a cualquier otra version qu esten usando, debes habilitar las conexiones remotas
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Tal como tienes la cadena de conexión, debería funcionar desde cualquier red, a condición de que exista conectividad con la tuya. Cerciórate de que la dirección IP que indicas en la cadena de conexión es alcanzable desde la máquina en la que ejecutas el programa, no vaya a ser que estés usando una IP privada detrás de un NAT o algo por el estilo. Y también, lógicamente, que el puerto 1433 no esté bloqueado por algún hardware de red (tal como un firewall) interpuesto entre los dos equipos.
En resumidas cuentas, el problema no está, como suponías, en la forma de indicar la conexión, que es correcta, sino que es un problema de infraestructura de red y administración de sistemas.
Buenas Alberto, gracias por responder. ¿Es necesario entonces que ambas redes tengan una conexión entre si? Es decir, si un cliente en otra población, por ejemplo, quiere acceder a la base de datos a través de mi aplicación, ¿debe estar conectado a mi red? ¿Hay alguna otra forma de hacerlo?
Muchas gracias.
-
hola
>>¿Es necesario entonces que ambas redes tengan una conexión entre si?
pero sino como esperas conectarte? digo de forma magina no se trasmiten los datos
>>si un cliente en otra población,
que seria "otra poblacion" ? si esta en otra area minimamente necesitara conexion a internet y usando esta se podria establecer una VPN a la red local
>>quiere acceder a la base de datos a través de mi aplicación, ¿debe estar conectado a mi red?
depende, la verdad no te explican muy claro de donde a donde quieres conectarte
por ejemplo, si tu aplicacion es web y la expones a internet no se necesita ninguna conexion a tu red
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
¿Es necesario entonces que ambas redes tengan una conexión entre si? Es decir, si un cliente en otra población, por ejemplo, quiere acceder a la base de datos a través de mi aplicación, ¿debe estar conectado a mi red?
Creo que el problema aquí está en la interpretación del término "conectado". Tiene que estar conectado en el sentido de que tiene que ser factible transmitir paquetes IP desde una red a la otra. No significa que tengas que tener un cable conectando directamente una red con la otra. Pueden ser dos redes conectadas cada una de ellas a Internet y con sus routers respectivos configurados de tal manera que permitan transmitir paquetes de una a otra. Ten presente que, en general, esto NO ocurre de forma predeterminada. Lo más normal es que de manera predeterminada las dos redes estén configuradas para usar un bloque de direcciones privadas (que no se enrutan a través de Internet) y que salgan al exterior mediante un mecanismo que se llama NAT ("Network Address Translation"), usualmente implementado dentro del router. Con esta configuración, solo hay acceso "saliente" desde cada red al exterior, pero no "entrante" desde el exterior al interior de la red privada. Esto implica que el equipo que está en la otra red no puede conectarse a uno que está en el interior de la tuya, porque no hay acceso "entrante" desde el exterior a tu red.
Hay, por supuesto, alternativas para esto: habilitar una VPN (red virtual privada), configurar NAT-inverso en el router, asignar una dirección pública a la máquina que está en tu red, etc. Pero todas ellas implican labores de administración de redes, no hay ninguna forma de que puedas activar esto solo con modificar tu programa o su cadena de conexión.
-
¿Es necesario entonces que ambas redes tengan una conexión entre si? Es decir, si un cliente en otra población, por ejemplo, quiere acceder a la base de datos a través de mi aplicación, ¿debe estar conectado a mi red?
Creo que el problema aquí está en la interpretación del término "conectado". Tiene que estar conectado en el sentido de que tiene que ser factible transmitir paquetes IP desde una red a la otra. No significa que tengas que tener un cable conectando directamente una red con la otra. Pueden ser dos redes conectadas cada una de ellas a Internet y con sus routers respectivos configurados de tal manera que permitan transmitir paquetes de una a otra. Ten presente que, en general, esto NO ocurre de forma predeterminada. Lo más normal es que de manera predeterminada las dos redes estén configuradas para usar un bloque de direcciones privadas (que no se enrutan a través de Internet) y que salgan al exterior mediante un mecanismo que se llama NAT ("Network Address Translation"), usualmente implementado dentro del router. Con esta configuración, solo hay acceso "saliente" desde cada red al exterior, pero no "entrante" desde el exterior al interior de la red privada. Esto implica que el equipo que está en la otra red no puede conectarse a uno que está en el interior de la tuya, porque no hay acceso "entrante" desde el exterior a tu red.
Hay, por supuesto, alternativas para esto: habilitar una VPN (red virtual privada), configurar NAT-inverso en el router, asignar una dirección pública a la máquina que está en tu red, etc. Pero todas ellas implican labores de administración de redes, no hay ninguna forma de que puedas activar esto solo con modificar tu programa o su cadena de conexión.
Muchísimas gracias por la explicación, da gusto aprender con gente como vosotros.
Voy a probar entonces a habilitar una VPN. Si no me equivoco, se puede hacer desde el propio código cierto? He leído algo acerca de DotRas. Si puedo hacerlo te agradecería muchísimo una pequeña explicación de cómo hacerlo para tener un camino a seguir.
Muchas gracias!
-
Voy a probar entonces a habilitar una VPN. Si no me equivoco, se puede hacer desde el propio código cierto?
-
Buenos días amigo,
Te comento que puedes realizar tus pruebas con un software que genere VPN virtuales como por ejemplo puedes usar uno que se llama "Hamc.." no te termine el nombre del programa ya que no es de microsoft por lo cual no te lo puedo comentar aquí pero ya con eso creas tu VPN virtual y luego a tu cadena de conexión la generas como un try catch como si te estuvieras conectando a bases de datos en cluster. Ejemplo
Lo que realizas aquí es que le dices al sistemas que si no detecta que la conexión es por la red local lo hará por la red virtual y con eso ya te funcionara si te diera algún error por favor brindamos imagen para ver de que manera te podemos apoyar mas.
Try{
Conexion de tu red local
}
catch{
Conexion de tu red virtual
}
Nota: Si mi respuesta te funciona por favor no olvides marcarla como respuesta. con esto ayudaras a personas que tengan el mismo problema a saber como se soluciono tu pregunta.
Jonathan Samayoa