none
Como saber cuando cambian los datos en la base de datos Sql Server RRS feed

  • Pregunta

  • ¡Saludos! estoy buscando ejecutar un codigo que cuadno un valor cambien en la base de datos me ejecute una funcion. He intentado hacerlo con SqlDependency llevandome de el ejemplo que da Microsoft en su pagina, y dentro de la funcion OnChange he puesto que me obtenga los datos de la base de datos,pero no me funciona. Aqui un ejemplo:

    private DB_Conexion conexion = new DB_Conexion();
    
            string connectionString = "Data Source=10.0.0.108;Initial Catalog=EmpleadosDB; MultipleActiveResultSets=True; User ID=user;Password=1234";
    
            void Initialization()
            {
                SqlDependency.Start(connectionString);
            }
    
            void SomeMethod()
            {
                // Assume connection is an open SqlConnection.  
    
                // Create a new SqlCommand object.  
                using (SqlCommand command = new SqlCommand(
                    "SELECT EmpleadoStated, WordSrtated, StarEmpleado FROM dbo.Empleado", conexion.AbriConexion()))
                {
    
                    // Create a dependency and associate it with the SqlCommand.  
                    SqlDependency dependency = new SqlDependency(command,"",2);
                    // Maintain the reference in a class member.  
    
                    // Subscribe to the SqlDependency event.  
                    dependency.OnChange += new
                       OnChangeEventHandler(OnDependencyChange);
    
                    // Execute the command.  
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        // Process the DataReader.  
                    }
                }
            }
            void OnDependencyChange(object sender, SqlNotificationEventArgs e)
            {
                buscarEmpleado1();
                buscarEmpleado2();
                buscarEmpleado3();
                buscarEmpleado4();
                ObtenerDatos();
            }
    
            void Termination()
            {
                // Release the dependency.  
                SqlDependency.Stop(connectionString);
            }
    
    Lo he iniciado junto con el form, le he dicho que inicie al inicio del form y nada... ¡AYUDA!

    miércoles, 2 de enero de 2019 23:55

Respuestas

  • SALUDOS.

    El codigo para la base de datos es el siguiente:

      private void buscarEmpleado1()
            {
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 1;
    
                logear = _Empleado.IniciarUser();
    
                try
                {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name1.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                NotificarCambio(logear);
                                Name1.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free1.Visible = true;
                                Busy1.Visible = false;
                            }
                            else
                            {
                                Name1.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free1.Visible = false;
                                Busy1.Visible = true;
                            }
                        }
                        else
                        {
                            Free1.Visible = false;
                            Busy1.Visible = true;
                            Name1.Text = "No conectado";
                            Name1.ForeColor = Color.DarkRed;
    
                        }
                    }
                }catch(Exception ex)
                {
                    Application.Exit();
                    MessageBox.Show(ex.Message);
                }
    
            }

    Pero tambien proble el OnDependencyChange con un messenger box pero aun si no me funcionaba!


            void OnDependencyChange(object sender, SqlNotificationEventArgs e)
            {
       MessageBox.Show("si");
            }

    Y creo una funcion con sqldependency.start:

            void Initialization()
            {
                SqlDependency.Start(connectionString);
            }


    Mientras carga el Form ejecuto a Initialization():

            private void Cajero_Load(object sender, EventArgs e)
            {
                Initialization();
            }

    Pero NADA ME FUNCIONA!

    El codigo completo va asi:

            #region Buscar Empleado
            private void buscarEmpleado1()
            {
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 1;
    
                logear = _Empleado.IniciarUser();
    
                try
                {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name1.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                NotificarCambio(logear);
                                Name1.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free1.Visible = true;
                                Busy1.Visible = false;
                            }
                            else
                            {
                                Name1.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free1.Visible = false;
                                Busy1.Visible = true;
                            }
                        }
                        else
                        {
                            Free1.Visible = false;
                            Busy1.Visible = true;
                            Name1.Text = "No conectado";
                            Name1.ForeColor = Color.DarkRed;
    
                        }
                    }
                }catch(Exception ex)
                {
                    Application.Exit();
                    MessageBox.Show(ex.Message);
                }
    
            }
    
            private void buscarEmpleado2()
            {
        
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 2;
    
                logear = _Empleado.IniciarUser();
                try {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name2.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                NotificarCambio(logear);
                                Name2.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free2.Visible = true;
                                Busy2.Visible = false;
                            }
                            else
                            {
                                Name2.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free2.Visible = false;
                                Busy2.Visible = true;
                            }
                        }
                        else
                        {
                            Free2.Visible = false;
                            Busy2.Visible = true;
                            Name2.Text = "No conectado";
                            Name2.ForeColor = Color.DarkRed;
    
                        }
                    }
                } catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
    
            }
            private void buscarEmpleado3()
            {
    
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 3;
    
    
                logear = _Empleado.IniciarUser();
                try
                {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name3.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                while(Free1.Visible == true)
                                {
                                    NotificarCambio(logear);
                                }
                                Name3.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free3.Visible = true;
                                Busy3.Visible = false;
                            }
                            else
                            {
                                Name3.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free3.Visible = false;
                                Busy3.Visible = true;
                            }
                        }
                        else
                        {
                            Free3.Visible = false;
                            Busy3.Visible = true;
                            Name3.Text = "No conectado";
                            Name3.ForeColor = Color.DarkRed;
    
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                
    
            }
            private void buscarEmpleado4()
            {
    
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 4;
    
                logear = _Empleado.IniciarUser();
                try
                {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name4.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                while (Free2.Visible == true)
                                {
                                    NotificarCambio(logear);
                                }
                                NotificarCambio(logear);        
                                Name4.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free4.Visible = true;
                                Busy4.Visible = false;
                            }
                            else
                            {
                                Name4.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free4.Visible = true;
                                Free4.Visible = false;
                                Busy4.Visible = true;
                            }
                        }
                        else
                        {
                            Free4.Visible = false;
                            Busy4.Visible = true;
                            Name4.Text = "No conectado";
                            Name4.ForeColor = Color.DarkRed;
    
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
              
            }
            #endregion
    
           
            private void Cajero_Load(object sender, EventArgs e)
            {
                Initialization();
            }
    
            private void NotificarCambio(SqlDataReader leer)
            {
                notifyIcon1.BalloonTipText = "El " + leer["EmpleadoName"].ToString() + " ya esta libre";
                notifyIcon1.BalloonTipTitle = leer["EmpleadoName"].ToString() + " (Libre)";
                notifyIcon1.ShowBalloonTip(0);
            }
    
    
    
    
            #region SqlDependency
            private DB_Conexion conexion = new DB_Conexion();
    
            string connectionString = "Data Source=10.0.0.108;Initial Catalog=EmpleadosDB; MultipleActiveResultSets=True; User ID=user;Password=1234";
    
            void Initialization()
            {
                SqlDependency.Start(connectionString);
            }
    
            void SomeMethod()
            {
                // Assume connection is an open SqlConnection.  
    
                // Create a new SqlCommand object.  
                using (SqlCommand command = new SqlCommand(
                    "SELECT EmpleadoStated, WordSrtated, StarEmpleado FROM dbo.Empleado", conexion.AbriConexion()))
                {
    
                    // Create a dependency and associate it with the SqlCommand.  
                    SqlDependency dependency = new SqlDependency(command, "", 2);
                    // Maintain the reference in a class member.  
    
                    // Subscribe to the SqlDependency event.  
                    dependency.OnChange += new
                       OnChangeEventHandler(OnDependencyChange);
    
                    // Execute the command.  
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        // Process the DataReader.  
                    }
                }
            }
            void OnDependencyChange(object sender, SqlNotificationEventArgs e)
            {
                buscarEmpleado1();
                buscarEmpleado2();
                buscarEmpleado3();
                buscarEmpleado4();
            }
    
            void Termination()
            {
                // Release the dependency.  
                SqlDependency.Stop(connectionString);
            }
            #endregion
    
        }


    Isaac Martinez







    jueves, 3 de enero de 2019 22:19

Todas las respuestas

  • Yo lo hice a lo bruto, con un control timer, poniendo la propiedad Interval en la cantidad de milisegundos que quería que transcurra entre cada verificación. En el evento Tic hago la consulta y el codigo necesario para verificar si cambiaron los datos.

    Saludos

    jueves, 3 de enero de 2019 0:55
  • Saludos... yo tambien lo hice asi, el problema con esto es que quiero enviar una notificacion cuado el usuario se conecte, que pasa, que la notificacion se envia cada vez que el timer se actualiza. Por eso queria hacerlo con el SqlDependency. Aun asi, muchas gracias. :3


    Isaac Martinez

    jueves, 3 de enero de 2019 1:25
  • Yo lo implementé en el siguiente escenario. En un formulario de inscripción se cargan más de 20 campos, de los cuales 5 son críticos, una vez guardados no se pueden modificar. Cuando un operador intenta guardar un cambio que involucre estos campos críticos, los cambios no se guardan, sino que se genera un pedido de cambio con los datos originales y las modificaciones requeridas. Este pedido de cambio es aceptado o rechazado por el supervisor. Luego se informa al operador que pidió el cambio si el mismo fue aceptado o rechazado.

    Para eso utilicé 2 timer uno para el supervisor y otro para los operadores.

    Supervisor: Cuando ingresa desde alguna pc el supervisor, se ejecuta (en el form_load) timerSupervisor.Start(). Este timer hará las consultas en su evento Tic para ver si hay cambios pendientes y si los hay se le informa a través de un label (u otro medio). El supervisor, a traveza de un form trata los pedidos de cambio.

    Operador: Cuando ingresa un operador se ejecuta timerOperador.Start(). Este timer hará las consultas en su evento Tic para ver si alguno de los cambios pedidos por él han sido resueltos. Se muestra en una grilla los cambios resueltos de los que aún no se notificó.

    Esto es en resumen lo que hice y está funcionando. No se si se ajusta a tus requerimientos.

    jueves, 3 de enero de 2019 2:06
  • hola

    >>he puesto que me obtenga los datos de la base de datos,pero no me funciona.

    en que contexto esta ese codigo ? si esta dentro de una clase recuerda que debes mantener la instancia para que no se destruya la de  SqlDependency y mantenga la inspeccion sobre los datos

    Por ejemplo quien invoca a SomeMethod() ? alli veo que lo declaras, pero como usas esa funcionalidad

    Ademas realizaste alguna actualizacion por fuera del codigo de los datos para que se genere el evento ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 3 de enero de 2019 3:22
  • SALUDOS.

    El codigo para la base de datos es el siguiente:

      private void buscarEmpleado1()
            {
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 1;
    
                logear = _Empleado.IniciarUser();
    
                try
                {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name1.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                NotificarCambio(logear);
                                Name1.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free1.Visible = true;
                                Busy1.Visible = false;
                            }
                            else
                            {
                                Name1.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free1.Visible = false;
                                Busy1.Visible = true;
                            }
                        }
                        else
                        {
                            Free1.Visible = false;
                            Busy1.Visible = true;
                            Name1.Text = "No conectado";
                            Name1.ForeColor = Color.DarkRed;
    
                        }
                    }
                }catch(Exception ex)
                {
                    Application.Exit();
                    MessageBox.Show(ex.Message);
                }
    
            }

    Pero tambien proble el OnDependencyChange con un messenger box pero aun si no me funcionaba!


            void OnDependencyChange(object sender, SqlNotificationEventArgs e)
            {
       MessageBox.Show("si");
            }

    Y creo una funcion con sqldependency.start:

            void Initialization()
            {
                SqlDependency.Start(connectionString);
            }


    Mientras carga el Form ejecuto a Initialization():

            private void Cajero_Load(object sender, EventArgs e)
            {
                Initialization();
            }

    Pero NADA ME FUNCIONA!

    El codigo completo va asi:

            #region Buscar Empleado
            private void buscarEmpleado1()
            {
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 1;
    
                logear = _Empleado.IniciarUser();
    
                try
                {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name1.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                NotificarCambio(logear);
                                Name1.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free1.Visible = true;
                                Busy1.Visible = false;
                            }
                            else
                            {
                                Name1.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free1.Visible = false;
                                Busy1.Visible = true;
                            }
                        }
                        else
                        {
                            Free1.Visible = false;
                            Busy1.Visible = true;
                            Name1.Text = "No conectado";
                            Name1.ForeColor = Color.DarkRed;
    
                        }
                    }
                }catch(Exception ex)
                {
                    Application.Exit();
                    MessageBox.Show(ex.Message);
                }
    
            }
    
            private void buscarEmpleado2()
            {
        
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 2;
    
                logear = _Empleado.IniciarUser();
                try {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name2.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                NotificarCambio(logear);
                                Name2.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free2.Visible = true;
                                Busy2.Visible = false;
                            }
                            else
                            {
                                Name2.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free2.Visible = false;
                                Busy2.Visible = true;
                            }
                        }
                        else
                        {
                            Free2.Visible = false;
                            Busy2.Visible = true;
                            Name2.Text = "No conectado";
                            Name2.ForeColor = Color.DarkRed;
    
                        }
                    }
                } catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
    
            }
            private void buscarEmpleado3()
            {
    
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 3;
    
    
                logear = _Empleado.IniciarUser();
                try
                {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name3.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                while(Free1.Visible == true)
                                {
                                    NotificarCambio(logear);
                                }
                                Name3.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free3.Visible = true;
                                Busy3.Visible = false;
                            }
                            else
                            {
                                Name3.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free3.Visible = false;
                                Busy3.Visible = true;
                            }
                        }
                        else
                        {
                            Free3.Visible = false;
                            Busy3.Visible = true;
                            Name3.Text = "No conectado";
                            Name3.ForeColor = Color.DarkRed;
    
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                
    
            }
            private void buscarEmpleado4()
            {
    
                CN_Empleado _Empleado = new CN_Empleado();
                SqlDataReader logear;
    
                _Empleado.Id_ = 4;
    
                logear = _Empleado.IniciarUser();
                try
                {
                    if (logear.Read() == true)
                    {
                        if (Convert.ToInt32(logear["StarEmpleado"]) == 1)
                        {
    
                            Name4.ForeColor = Color.Black;
                            if (Convert.ToInt32(logear["EmpleadoStated"]) == 1)
                            {
                                while (Free2.Visible == true)
                                {
                                    NotificarCambio(logear);
                                }
                                NotificarCambio(logear);        
                                Name4.Text = logear["EmpleadoName"].ToString() + " (Libre)";
                                Free4.Visible = true;
                                Busy4.Visible = false;
                            }
                            else
                            {
                                Name4.Text = logear["EmpleadoName"].ToString() + " (Ocupada)";
                                Free4.Visible = true;
                                Free4.Visible = false;
                                Busy4.Visible = true;
                            }
                        }
                        else
                        {
                            Free4.Visible = false;
                            Busy4.Visible = true;
                            Name4.Text = "No conectado";
                            Name4.ForeColor = Color.DarkRed;
    
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
              
            }
            #endregion
    
           
            private void Cajero_Load(object sender, EventArgs e)
            {
                Initialization();
            }
    
            private void NotificarCambio(SqlDataReader leer)
            {
                notifyIcon1.BalloonTipText = "El " + leer["EmpleadoName"].ToString() + " ya esta libre";
                notifyIcon1.BalloonTipTitle = leer["EmpleadoName"].ToString() + " (Libre)";
                notifyIcon1.ShowBalloonTip(0);
            }
    
    
    
    
            #region SqlDependency
            private DB_Conexion conexion = new DB_Conexion();
    
            string connectionString = "Data Source=10.0.0.108;Initial Catalog=EmpleadosDB; MultipleActiveResultSets=True; User ID=user;Password=1234";
    
            void Initialization()
            {
                SqlDependency.Start(connectionString);
            }
    
            void SomeMethod()
            {
                // Assume connection is an open SqlConnection.  
    
                // Create a new SqlCommand object.  
                using (SqlCommand command = new SqlCommand(
                    "SELECT EmpleadoStated, WordSrtated, StarEmpleado FROM dbo.Empleado", conexion.AbriConexion()))
                {
    
                    // Create a dependency and associate it with the SqlCommand.  
                    SqlDependency dependency = new SqlDependency(command, "", 2);
                    // Maintain the reference in a class member.  
    
                    // Subscribe to the SqlDependency event.  
                    dependency.OnChange += new
                       OnChangeEventHandler(OnDependencyChange);
    
                    // Execute the command.  
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        // Process the DataReader.  
                    }
                }
            }
            void OnDependencyChange(object sender, SqlNotificationEventArgs e)
            {
                buscarEmpleado1();
                buscarEmpleado2();
                buscarEmpleado3();
                buscarEmpleado4();
            }
    
            void Termination()
            {
                // Release the dependency.  
                SqlDependency.Stop(connectionString);
            }
            #endregion
    
        }


    Isaac Martinez







    jueves, 3 de enero de 2019 22:19