none
Como conectar a base de datos SQL Server desde equipo Cliente RRS feed

  • Pregunta

  • Buenos días, vengo iniciándome en SQL Server, anteriormente trabajaba con Acces, pero tuve problemas de concurrencia desde que agregue mas equipos clientes.

    Bueno mi caso es el siguiente: he creado una base de datos desde SQL Server 2014 Management Studio, luego lo copie a una carpeta e hice la conexión con Visual Studio 2015 y Vb.net.

     Dim CadenaConexion As String
        
                cm = New SqlConnection
                CadenaConexion = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=\\SERVIDOR\Db\Bd_elecciones.mdf;Integrated Security=True;Connect Timeout=30"
                cm.ConnectionString = CadenaConexion
                cm.Open()

    Hasta ahí todo funciona bien, pero cuando instalo el sistema en otras PCs Clientes no me reconoce la Base de datos, tengo la carpeta de la BD debidamente compartida e instale el SQL Server 2014 Xpress pero sigue sin reconocer la Base datos.

    Quisiera saber que mas tengo que hacer, ya que en Acces era muy sencillo, solo era cuestión de direccionar la base de datos, pero veo que en SQL es distinto. ayúdenme por favor son nuevo en esto. 


    Ricardo Rafael Rivas

    viernes, 29 de noviembre de 2019 13:57

Respuestas

  •  tengo la carpeta de la BD debidamente compartida

    En realidad quieres decir que la tienes indebidamente compartida.

    Eso se hace en Access, que según dices es lo que solías usar, pero SQL Server funciona de forma totalmente distinta.

    Se instala un servidor de base de datos tal como por ejemplo la edición Express que mencionabas, en un único PC (no en todos los puestos que van a acceder a ella). El archivo o archivos de base de datos residen en una carpeta de ese PC. La carpeta en cuastión no debe estar compartida; es más, de forma predeterminada, cuando creas una base de datos multiusiario (no la localdb que estás usando, que es mono-usuario) te la crea en una carpeta super-restringida a la que no tiene acceso nadie salvo el Servicio SQL.

    El servicio SQL publica una dirección IP a través de la cuál recibe comandos desde los PCs. Los PCs no tienen ninguna forma de acceder al fichero de la base de datos. Lo que hacen es transmitir comandos SQL a esa única instancia del servidor que accede al archivo, y recibir los datos resultantes a través de la línea de comunicación.

    Como ves, es bastante diferente de cómo funcionaba el Access. No te confundas por el hecho de que el SQl Server en modo localDb sí que usa un archivo en una carpeta conocida. Esta modalidad solo vale para mono-usuario. Cuando hay puestos remotos que tienen que acceder a los datos, hay que pasar al modo de funcionamiento en el que se monta el archivo sobre el Servicio SQL. En los puestos apenas se nota, solo hay que cambiar la cadena de conexión para que contenga el nombre del servidor/instancia y el nombre de la base de datos, y todo funciona igual. Pero en el servidor hay que aprender a instalar y configurar la base de datos en este modo de funcionamiento.

    viernes, 29 de noviembre de 2019 14:22
  • Primero, copiar la BD: Simplemente toma el .mdf y el .ldf y cópialos a una carpeta en el servidor, preferiblemente a la suya, que será algo así como MSSQL/DATA por debajo de donde esté instalado el SQL Server, pero también funciona si usas otra carpeta con la condición de que el servicio SQL tenga acceso a ella (por ejemplo, no vale algo por debajo de Users\tuNombre salvo que le cambies los permisos).

    Después, abres el SSMS y usas la opcion de "Attach" (creo que en la version española se llama "Adjuntar base de datos") para montar los archivos que has copiado en una base de datos. La base de datos tendrá un nombre que verás bajo Databases en el examinador de objetos de SSMS. Fíjate en ese nombre, que nos hará falta ara la cadena de conexión. Vamos a suponer que es "MiBase".

    Entonces cambia la cadena de conexión así:

    "Server=PcServidor\SqlExpress;Database=MiBase;trusted_connection=Yes;"

    Aquí hay que matizar varias cosas. Donde dice PcServidor hay que poner el nombre del PC donde instalaste la base de datos, y cerciorarte de que ese nombre se resuelve correctamente desde el PC cliente que accede a la base de datos. Donde dice SqlExpress, hay que poner el nombre de la instancia que le asignaste a tu SQL Server Express en el momento de instalarlo. Suele ser "SqlExpress", pero si le pusiste otro nombre, hay que trasladarlo correctamente a la cadena de conexión.

    Finalmente, algo delicado, que es el modo de identificar al usuario que se conecta a la base de datos. En SQL Server no existe la posibilidad de "acceso anónimo sin contraseña" como en Access. Necesariamente tiene que crearse un Login en SQL Server para que el usuario se conecte, y ese login hay que ponerlo en la cadena de conexión. En el ejemplo te he puesto "trusted_connection=Yes" que significa "usar el usuario de Windows", es decir, tomar las credenciales del usuario que hizo login en Windows y pasárselas al servidor SQL. Esto solo funciona si los dos equipos son miembros de un dominio de directorio activo. De lo contrario hay que pasar el servidor SQL a lo que se llama "modo mixto" (Propiedades->Seguridad en SSMS, reiniciar después de cambiarlo) y crear un login de SQL con usuario y contraseña (Seguridad->Logins). Después ese usuario y contraseña se escribe en la cadena de conexión:

    "Server=PcServidor\SqlExpress;Database=MiBase;trusted_connection=No;User Id=miUsuario;Pwd=miPassword;"

    No hay que olvidar conceder a ese Login suficientes permisos para hacer lo que tenga que hacer sobre la base de datos que Adjuntaste. Puedes hacerlo desde "User Mapping" en las Propiedades del Login en SSMS.

    • Marcado como respuesta Ricardo_raf7 viernes, 29 de noviembre de 2019 16:00
    viernes, 29 de noviembre de 2019 15:43

Todas las respuestas

  •  tengo la carpeta de la BD debidamente compartida

    En realidad quieres decir que la tienes indebidamente compartida.

    Eso se hace en Access, que según dices es lo que solías usar, pero SQL Server funciona de forma totalmente distinta.

    Se instala un servidor de base de datos tal como por ejemplo la edición Express que mencionabas, en un único PC (no en todos los puestos que van a acceder a ella). El archivo o archivos de base de datos residen en una carpeta de ese PC. La carpeta en cuastión no debe estar compartida; es más, de forma predeterminada, cuando creas una base de datos multiusiario (no la localdb que estás usando, que es mono-usuario) te la crea en una carpeta super-restringida a la que no tiene acceso nadie salvo el Servicio SQL.

    El servicio SQL publica una dirección IP a través de la cuál recibe comandos desde los PCs. Los PCs no tienen ninguna forma de acceder al fichero de la base de datos. Lo que hacen es transmitir comandos SQL a esa única instancia del servidor que accede al archivo, y recibir los datos resultantes a través de la línea de comunicación.

    Como ves, es bastante diferente de cómo funcionaba el Access. No te confundas por el hecho de que el SQl Server en modo localDb sí que usa un archivo en una carpeta conocida. Esta modalidad solo vale para mono-usuario. Cuando hay puestos remotos que tienen que acceder a los datos, hay que pasar al modo de funcionamiento en el que se monta el archivo sobre el Servicio SQL. En los puestos apenas se nota, solo hay que cambiar la cadena de conexión para que contenga el nombre del servidor/instancia y el nombre de la base de datos, y todo funciona igual. Pero en el servidor hay que aprender a instalar y configurar la base de datos en este modo de funcionamiento.

    viernes, 29 de noviembre de 2019 14:22
  • Entiendo, eso quiere decir que tengo que hacer la mayoría de configuraciones en mi servidor SqL, bueno ¿y en mi cadena de conexión cual seria la sintaxis?

    Y la otra duda es: yo estoy creado la base de datos en mi PC, el servidor sera otro equipo, como hago para copiar la base de datos y toda la configuración a la pc que hará de servidor?


    Ricardo Rafael Rivas



    • Editado Ricardo_raf7 viernes, 29 de noviembre de 2019 14:36
    viernes, 29 de noviembre de 2019 14:29
  • Primero, copiar la BD: Simplemente toma el .mdf y el .ldf y cópialos a una carpeta en el servidor, preferiblemente a la suya, que será algo así como MSSQL/DATA por debajo de donde esté instalado el SQL Server, pero también funciona si usas otra carpeta con la condición de que el servicio SQL tenga acceso a ella (por ejemplo, no vale algo por debajo de Users\tuNombre salvo que le cambies los permisos).

    Después, abres el SSMS y usas la opcion de "Attach" (creo que en la version española se llama "Adjuntar base de datos") para montar los archivos que has copiado en una base de datos. La base de datos tendrá un nombre que verás bajo Databases en el examinador de objetos de SSMS. Fíjate en ese nombre, que nos hará falta ara la cadena de conexión. Vamos a suponer que es "MiBase".

    Entonces cambia la cadena de conexión así:

    "Server=PcServidor\SqlExpress;Database=MiBase;trusted_connection=Yes;"

    Aquí hay que matizar varias cosas. Donde dice PcServidor hay que poner el nombre del PC donde instalaste la base de datos, y cerciorarte de que ese nombre se resuelve correctamente desde el PC cliente que accede a la base de datos. Donde dice SqlExpress, hay que poner el nombre de la instancia que le asignaste a tu SQL Server Express en el momento de instalarlo. Suele ser "SqlExpress", pero si le pusiste otro nombre, hay que trasladarlo correctamente a la cadena de conexión.

    Finalmente, algo delicado, que es el modo de identificar al usuario que se conecta a la base de datos. En SQL Server no existe la posibilidad de "acceso anónimo sin contraseña" como en Access. Necesariamente tiene que crearse un Login en SQL Server para que el usuario se conecte, y ese login hay que ponerlo en la cadena de conexión. En el ejemplo te he puesto "trusted_connection=Yes" que significa "usar el usuario de Windows", es decir, tomar las credenciales del usuario que hizo login en Windows y pasárselas al servidor SQL. Esto solo funciona si los dos equipos son miembros de un dominio de directorio activo. De lo contrario hay que pasar el servidor SQL a lo que se llama "modo mixto" (Propiedades->Seguridad en SSMS, reiniciar después de cambiarlo) y crear un login de SQL con usuario y contraseña (Seguridad->Logins). Después ese usuario y contraseña se escribe en la cadena de conexión:

    "Server=PcServidor\SqlExpress;Database=MiBase;trusted_connection=No;User Id=miUsuario;Pwd=miPassword;"

    No hay que olvidar conceder a ese Login suficientes permisos para hacer lo que tenga que hacer sobre la base de datos que Adjuntaste. Puedes hacerlo desde "User Mapping" en las Propiedades del Login en SSMS.

    • Marcado como respuesta Ricardo_raf7 viernes, 29 de noviembre de 2019 16:00
    viernes, 29 de noviembre de 2019 15:43
  • Finalmente lo he logrado, gracias por su ayuda...

    - Una consulta mas, esta es mi cadena de conexión con la que logre conectarla, ¿Crees que tenga algún problema a futuro?, he creado un usuario "Yanet" y lo usare para distribuir el aplicativo que ira en los terminales, ¿habra algun problema si lo destribuyo asi?, es decir que 10 o mas terminales inicien con la misma cadena de conexion, o tengo que crear varios usuarios?

    Dim CadenaConexion As String
            Try
                cm = New SqlConnection

                CadenaConexion = ("Data Source=172.18.96.161,1433; initial catalog=Bd_elecciones; user id=Yanet;password=jec2019;")
                cm.ConnectionString = CadenaConexion
                cm.Open()
                       mostrar_votaciones()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try


    Ricardo Rafael Rivas

    viernes, 29 de noviembre de 2019 16:04
  • No hay problema en que varios usuarios usen la misma conexión. Solo es necesario crear varios usuarios cuando necesitas asignarles distintos permisos, o cuando quieres auditar en el lado servidor cuáles son las operaciones que hace cada usuario.

    Lo que sí que tendrás que cambiar cuando lo distribuyas es la dirección IP que tienes en el DataSource. Ahí tendrás que poner la dirección que realmente tenga el servidor al que se conectan los clientes. Cerciórate de que es una dirección fija y no asignada por DHCP, de lo contrario te puede dejar de funcionar en cualquier momento. Si no puedes poner una dirección fija, es mejor que pongas nombre de equipo en lugar de dirección.

    Ah, y el 1433 puedes omitirlo, ya que es el valor predeterminado.

    viernes, 29 de noviembre de 2019 19:16