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