none
¿cómo reaccionar ante un evento de la base de datos? RRS feed

  • Pregunta

  • hola a todos. mi pregunta tiene que ver con lo siguiente:

    tengo una aplicacion pequeña en vb.net 2010 y una tabla en una base de datos postgres

    lo que quiero es que cuando se agrega un nuevo registro en esa tabla que cumpla con una condicion WHERE de SQL (por ejemplo "select * from alumnos where edad=22") me lo muestre en cualquier lado (puede ser una grilla, una caja de text, lo que sea)

    por ejemplo: cada vez la consulta arroja al menos  un resultado o mas, que me los muestre en un datagridview

    lo que hago actualmente es usar un timer que realiza la consulta cada 5 segundos y ademas uso el backgroundworker

    MI PREGUNTA ES: ¿hay una forma más efectiva de lograr esto?

    porque puede ser que en ciertos momentos de poca actividad haga 12 consultas por minuto y si por media hora no ocurre ningún evento son demasiadas consultas realizadas inutilmente. pienso que quizas haya una forma de que el vb.net reaccione solamente en caso de que haya un registro que cumpla con la consulta deseada.

    gracias desde ya y estoy seguro que alguien puede encontrar la solución

    • Cambiado Enrique M. Montejo domingo, 5 de febrero de 2012 10:58 acceso a datos (De:Lenguaje VB.NET)
    sábado, 4 de febrero de 2012 22:51

Respuestas

  • lo que hago actualmente es usar un timer que realiza la consulta cada 5 segundos y ademas uso el backgroundworker

    MI PREGUNTA ES: ¿hay una forma más efectiva de lograr esto?

    Para que la consulta sea lo menos costosa posible, una solución es la siguiente:

    - Crea una pequeña tabla auxiliar con un solo registro y una sola columna de tipo numérico. Inicializala a cero.

    - Sobre la tabla en la que quieres consultar tu condición, crea un trigger, de forma que cada vez que se modifique la tabla el trigger compruebe si se cumple la condición, y en ese caso incrementas el valor del campo de la tabla auxiliar.

    - Desde el programa cliente, ejecutas con el backgroundworker (o con un Timer) una consulta cada 5 segundos, pero esta consulta la ejecutas contra la tabla auxiliar. Como solo tiene un registro y un campo, esta consulta debería ser rapidísima. Simplemente compruebas si el valor numérico es mayor que el último que leíste, y en ese caso sabes que se han producido cambios en la tabla principal.

     

    • Marcado como respuesta nkne domingo, 5 de febrero de 2012 16:27
    domingo, 5 de febrero de 2012 13:38

Todas las respuestas

  • perpo las personas no llevan a la edad cada 5 segundos, porque un timer con tan corto tiempo, entre cada intervalo dfe 5 seg que probabilidad hay que alguien llegue a los 22 años ?

    porque no pones al menso un tomer de varias horas que total dara el mismo efecto, es ams porque solo no cargas el valor cuando se abre la aplicacion, con que al menso se eejcute uan vez al dia ya sabras si para ese dia alquien llego a los 22 años

    no ocurre ningún evento son demasiadas consultas realizadas inutilmente. pienso que quizas haya una forma de que el vb.net reaccione solamente en caso de que haya un registro que cumpla con la consulta deseada.

    tu lo ahs dicho, no tiene sentido ese intervalo que defines, con lanzar la consulta cada 24 hs sera mas que suficiente, de un dia para otro alguien puede llegar a cumplir 22 años, pero de un seg al otro nunca

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 4 de febrero de 2012 23:12
  • gracias Leandro pero no es lo que necesito. suponte que hago cualquier otra aplicacion en la que necesito hacer un control cada 5 segundos o menos (cada 1 segundo) como un sistema de chat... mi pregunta fue genérica, no específica. me gustaría encontrar una forma, si es que la hay. gracias desde ya y saludos
    • Editado nkne domingo, 5 de febrero de 2012 0:21
    domingo, 5 de febrero de 2012 0:20
  • Verificate a ver si la notificacion de evento planteada en este hilo aporta a tu necesidad

    http://social.msdn.microsoft.com/Forums/es/vbes/thread/e666e263-68c9-4d0e-a769-a5ad4a2d98dd


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    My Blog
    domingo, 5 de febrero de 2012 0:22
  • gracias a ambos por las respuestas. la "notificacion de evento" es mas o menos lo que necesito, pero es exclusiva de sql server.

    gracias y saludos

    domingo, 5 de febrero de 2012 12:26
  • lo que hago actualmente es usar un timer que realiza la consulta cada 5 segundos y ademas uso el backgroundworker

    MI PREGUNTA ES: ¿hay una forma más efectiva de lograr esto?

    Para que la consulta sea lo menos costosa posible, una solución es la siguiente:

    - Crea una pequeña tabla auxiliar con un solo registro y una sola columna de tipo numérico. Inicializala a cero.

    - Sobre la tabla en la que quieres consultar tu condición, crea un trigger, de forma que cada vez que se modifique la tabla el trigger compruebe si se cumple la condición, y en ese caso incrementas el valor del campo de la tabla auxiliar.

    - Desde el programa cliente, ejecutas con el backgroundworker (o con un Timer) una consulta cada 5 segundos, pero esta consulta la ejecutas contra la tabla auxiliar. Como solo tiene un registro y un campo, esta consulta debería ser rapidísima. Simplemente compruebas si el valor numérico es mayor que el último que leíste, y en ese caso sabes que se han producido cambios en la tabla principal.

     

    • Marcado como respuesta nkne domingo, 5 de febrero de 2012 16:27
    domingo, 5 de febrero de 2012 13:38
  • lo que hago actualmente es usar un timer que realiza la consulta cada 5 segundos y ademas uso el backgroundworker

    MI PREGUNTA ES: ¿hay una forma más efectiva de lograr esto?

    Para que la consulta sea lo menos costosa posible, una solución es la siguiente:

    - Crea una pequeña tabla auxiliar con un solo registro y una sola columna de tipo numérico. Inicializala a cero.

    - Sobre la tabla en la que quieres consultar tu condición, crea un trigger, de forma que cada vez que se modifique la tabla el trigger compruebe si se cumple la condición, y en ese caso incrementas el valor del campo de la tabla auxiliar.

    - Desde el programa cliente, ejecutas con el backgroundworker (o con un Timer) una consulta cada 5 segundos, pero esta consulta la ejecutas contra la tabla auxiliar. Como solo tiene un registro y un campo, esta consulta debería ser rapidísima. Simplemente compruebas si el valor numérico es mayor que el último que leíste, y en ese caso sabes que se han producido cambios en la tabla principal.

     

    voy a implementarlo de esta forma por ser la mas versatil, facil y compatible con cualquier origen de datos... gracias y saludos
    domingo, 5 de febrero de 2012 16:27