none
Base de datos con 2 usuarios al mismo tiempo RRS feed

  • Pregunta

  • Tengo un problema con una aplicacion de escritorio, mis aplicaciones desarrolladas anteriormente solo eran conexiones a la base de datos de un unico usuario.

    En esta ocacion tengo una aplicacion que esta en un "servidor", la cual si se ejecuta desde el usuario1 puedo acceder y visualizar la informacion que se necesite de la base de datos, si cierro la aplicacion y el usuario2 del mismo servidor inicia la aplicacion igual puede visualizar la informacion, pero al tener abierta la aplicacion en cualquiera de los usuarios si el otro usuario abre la aplicacion no deja usar la base de datos.

    No se como solucionar esto ya que como dije antes siempre eran base de datos que solo un unico usuario lo usaba, cabe mencionar que tengo sql express 2008.

    Espero alguien me pueda ayudar y orientar sobre que se debe hacer en este caso

    miércoles, 25 de octubre de 2017 19:58

Respuestas

  • [...] pero es que esta prueba lo estoy haciendo con la base de datos solita sin montarlo en el sqlserver
    Bueno, eso no es del todo exacto. En realidad, cuando usas el modo "user instance" sí que se monta en el SqlServer, o que pasa es que se monta dinámincamente en exclusiva cuando se está usando, y luego se desmonta automáticamente cuando el programa la cierra definitivamente. El énfasis está en "en exclusiva". Este modo de funcionamiento está diseñado para trabajar con un solo usuario, y no es compatible con que otro usuario monte la base de datos simultaneamente. Me temo que si quieres que dos usuarios accedan simultaneamente a la base de datos, no vas a tener más remedio que montarla de forma "permanente" en Sql Server y cambiar en consonancia la cadena de conexión.
    lunes, 30 de octubre de 2017 16:33
    Moderador

Todas las respuestas

  • Mostrá el código utilizado para acceder a la base de datos. En que programa estás programando?
    miércoles, 25 de octubre de 2017 23:32
  • hola tengo una datagridview que al iniciar el form se llena con una consulta

                SqlCommand nuevo;
                SqlDataReader dr;
                con.Open();
                nuevo = new SqlCommand("SELECT Nombre FROM empresa order by Nombre asc", con);
                dr = nuevo.ExecuteReader();
                while (dr.Read())
                {
                    cmboxEmpresa.Items.Add(dr["Nombre"].ToString());
    
                }
                con.Close();

    como ya habia dicho al iniciar el formulario todo bien, pero si no lo cierro y otro usuario en otra sesion del servidor inicia tambien la aplicacion a este segundo usuario le marca un error y no deja usar la base de datos

    sábado, 28 de octubre de 2017 0:35
  • Probá cerrando también el datareader:

                SqlCommand nuevo;
                SqlDataReader dr;
                con.Open();
                nuevo = new SqlCommand("SELECT Nombre FROM empresa order by Nombre asc", con);
                dr = nuevo.ExecuteReader();
                while (dr.Read())
                {
                    cmboxEmpresa.Items.Add(dr["Nombre"].ToString());
    
                }
                dr.Close();
                con.Close();

    Además, si la cadena de conexión (Propiedad ConnectionString) tinene algo así: ...mode=Exclusive..., en ese caso, mientras la conexión esté abierta no se podrás abrir otra conexión.



    • Editado AntiWork sábado, 28 de octubre de 2017 3:03
    sábado, 28 de octubre de 2017 2:55
  • Releyendo tu pregunta, me inclino por revisar la definición de la conexión "con", seguramente allí esta establecido en la cadena de conexión "... ;file Mode=Exclusive;...", si es así borrá esa parte.
    sábado, 28 de octubre de 2017 3:13
  • Chequea la cadena de conexión de la aplicación y mira si tiene esto File Mode=Exclusive;. Si lo tiene quitalo.

    Por otra parte si otro usuario esta haciendo una una instrucción de actualización de datos (INSERT, DELETE, UPDATE) sobre esa tabla  estos datos son bloqueados por SQL Server hasta que finaliza la instrucción de actualización (o la transacción si la instrucción se encuentra dentro de una). Si intentas ejecutar una instrucción de lectura ésta esperará hasta que los datos se desbloqueen y entonces realizará la lectura y devolverá los datos.

    Para uevitar esto puede utilizar el comando NOLOCK:

    SELECT Nombre FROM empresa WITH (NOLOCK) order by Nombre asc




    sábado, 28 de octubre de 2017 8:03
  • Buenos dias, lo que te recomendaria es usar ADO en "modo desconectado", osea que realizas una consulta, y cerras la conexion. Consultas o insertas o haces una update, lo que haces, siempre es instanciar la conexion y abrir, ejecutar y cerrar, con eso no tendrias que tener problemas. Lo que tendrias que revisar es la cadena de conexion con la aplicacion que esas desarrollando. 

    Saludos,


    Saludos, Gastón Marengo

    sábado, 28 de octubre de 2017 13:05
  • Muestra tu sub 

    con.Open(); 

    Si necesitas ayuda sube tu avance de otro modo no puedo ayudarte , Suerte!

    sábado, 28 de octubre de 2017 13:14
  • Probá cerrando también el datareader:

                SqlCommand nuevo;
                SqlDataReader dr;
                con.Open();
                nuevo = new SqlCommand("SELECT Nombre FROM empresa order by Nombre asc", con);
                dr = nuevo.ExecuteReader();
                while (dr.Read())
                {
                    cmboxEmpresa.Items.Add(dr["Nombre"].ToString());
    
                }
                dr.Close();
                con.Close();

    Además, si la cadena de conexión (Propiedad ConnectionString) tinene algo así: ...mode=Exclusive..., en ese caso, mientras la conexión esté abierta no se podrás abrir otra conexión.



    SqlConnection con = new SqlConnection(@"Data Source=.\SQLExpress;AttachDbFilename=C:\BDPrueba\prueba.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");

    esta es mi cadena de conexion, investigando y leyendo en otros lados encontre que usando :

    Sqlconnection.ClearAllPools();

    se cierra por completo la conexion y con eso al parecer se soluciono mi problema, lo que ahora me surge una duda mas.

    Mi duda ahora, que sucedera cuando 2 usuarios intenten insertar informacion(cada uno desde su sesion) y lo realizen al mismo tiempo? 

    Suena muy extremista y que son pocas probabilidades para que suceda este escenario, pero si sucede, ninguno de los 2 podra insertar informacion y se producira un error en ambos usuarios? o es que uno de los 2 si podra y el otro tendra un error, a lo que si sucede el segundo caso quiere decir que previamente tendre que comprobar si la conexion esta abierta para dejarlo como en una especie de cola hasta que se cierre la conexion?  

    Espero haberme explicado.

    domingo, 29 de octubre de 2017 19:42
  • No soy experto en sqlserver, pero veo algunas cosa que quiero señalarte: El punto, antes de la barra invertida, significa que el servidor está instalado en la pc desde la que ejecutás el programa. Si lo querés ejecurar en otra pc, a travez de una red no veo como resolverías eso. Además no hay que estar haciendo referencia a la ruta donde se encuentra el archivo de la base de datos, de eso se ocupa sqlserver.

    Proba con algo así:

    SqlConnection con = new SqlConnection(@"Data Source=Pc03\SQLExpress;Initial Catalog=prueba;User ID=NomUs;Password=******"

    Pc03: es el nombre de la pc donde está instalado sqlserver.

    prueba: se supone que es el nombre de la base de datos

    NomUs: el el nombre de un usuario que debes crear.

    Password: es la contraseña de ese usuario.


    • Editado AntiWork domingo, 29 de octubre de 2017 23:39
    domingo, 29 de octubre de 2017 23:32
  • si yo se, aun que gracias por tu observacion, pero es que esta prueba lo estoy haciendo con la base de datos solita sin montarlo en el sqlserver
    lunes, 30 de octubre de 2017 7:13
  • En este artículo está explicado tu problema User Instance. "User Instance=true" te permite crear una especie de copia de la base de datos, llamada instancia de usuario, es solo para ese usuario. 
    lunes, 30 de octubre de 2017 11:22
  • [...] pero es que esta prueba lo estoy haciendo con la base de datos solita sin montarlo en el sqlserver
    Bueno, eso no es del todo exacto. En realidad, cuando usas el modo "user instance" sí que se monta en el SqlServer, o que pasa es que se monta dinámincamente en exclusiva cuando se está usando, y luego se desmonta automáticamente cuando el programa la cierra definitivamente. El énfasis está en "en exclusiva". Este modo de funcionamiento está diseñado para trabajar con un solo usuario, y no es compatible con que otro usuario monte la base de datos simultaneamente. Me temo que si quieres que dos usuarios accedan simultaneamente a la base de datos, no vas a tener más remedio que montarla de forma "permanente" en Sql Server y cambiar en consonancia la cadena de conexión.
    lunes, 30 de octubre de 2017 16:33
    Moderador