OracleDependency: controla cambios en la base de datos desde código

La clase de OracleDependency la puedes encontrar en las librerías que puedes descargar de NuGet.

  • Oracle.ManagedDataAccess
  • Oracle.ManagedDataAccess.EntityFramework

La funcionalidad que te proporciona esta clase es crear un evento cuando haya un cambio en la base de datos, el cual manejamos con la librería. Véase el ejemplo:

Crearemos una clase llamada Pipe, que tendrá un método OraclePipeListener() encargado de crear y asignar el evento. En este caso estará escuchando TABLA_EVENTOS y una vez se disparé se procederá a analizar con el método DependecyChange(…) que buscará algún patrón que determine lo que se va hacer. En el caso que vemos el campo PROCESADO = 0.

Como se ve, se creará un delegado que se le pasará el método a ejecutar y un evento encargado de disparar la funcionalidad. Un detalle, el atributo IsNotifiedOnce indica si se va a detectar solo la primera vez (true) o todas (false).

 
    public class Pipe
    {
        public static OracleConnection con = null;
        public static OracleDependency dep = null;
 
        public static void OraclePipeListener()
        {
            con = new OracleConnection(ConfigurationManager.ConnectionStrings["AOPEntities"].ConnectionString);
            con.Open();
 
            OracleCommand cmd = new OracleCommand("select * from TABLA_EVENTOS", con);
 
            dep = new Oracle.ManagedDataAccess.Client.OracleDependency(cmd);
            dep.OnChange += new OnChangeEventHandler(DependencyChange);
 
            cmd.Notification.IsNotifiedOnce = false;
            cmd.AddRowid = true;
 
            cmd.ExecuteNonQuery();
            con.Close();
            con.Dispose();
        }
 
        public static void DependencyChange(object src, EventArgs arg)
        {
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = con;
            cmd.CommandText = "select * from TABLA_EVENTOS where PROCESADO = 0";
            cmd.CommandType = CommandType.Text;
            OracleDataReader dr = cmd.ExecuteReader();
 
            while (dr.Read())
            {
 
            }
 
        }
 
        public static event EventHandler OnTable_Change;
    }
 
    public delegate void EventHandler(object sender, EventArgs arg);

Cuando este la clase Pipe montada solo faltará añadir el método en el Application_Start()

 
Application_Start() { // Global.asax
//....
Pipe.OraclePipeListener();
//....

Tienes más ejemplos en hotexamples OracleDependency

De la misma forma tienes SqlDependency para SQLServer que siempre va mejor por se tecnología de Microsoft

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *