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