public int StartDBListening(string query, OnChangeEventHandler func) { int result = -1; OracleCommand cmd = null; try { if (ConnectionOpen()) { cmd = new OracleCommand(query, _Connection); cmd.AddRowid = true; //OracleDependency dep = new OracleDependency(cmd); dep.AddCommandDependency(cmd); cmd.Notification.IsNotifiedOnce = false; bool buldu = false; foreach (var item in dep.RegisteredResources) { if (item.ToString() == query) { buldu = true; } } if (buldu == false) { dep.OnChange += new OnChangeEventHandler(func); } cmd.ExecuteNonQuery(); } } catch (OracleException oex) { } catch (Exception ex) { LogIslemleri.LogYaz(ex.Message); result = -1; } finally { if (cmd != null) { cmd.Dispose(); } CloseConnection(); } return(result); }
public Task StartListener() => Task.Run(() => { var dependency = new OracleDependency { QueryBasedNotification = false }; dependency.OnChange += this.OnNotification; var conn = this.CreateConnection(); var cmd = conn.CreateCommand(); dependency.AddCommandDependency(cmd); cmd.CommandText = "SELECT * FROM CHATS"; cmd.AddRowid = true; cmd.Notification.IsNotifiedOnce = false; cmd.ExecuteNonQuery(); });
/// <summary>Инициализирует процесс отслеживания изменений в БД</summary> private void InitNotifier() { NotifierConnection = new OracleConnection(ConnectionString); NotifierConnection.AutoCommit = false; NotifierConnection.Open(); // открываем постоянное соединение с БД // подписываемся на получение информации об обновлениях таблиц Notifier = new OracleDependency(); Notifier.QueryBasedNotification = false; Notifier.OnChange += Dependency_OnChange; StringBuilder SQLText = new StringBuilder(); for (int i = 0; i < SharedDataInfo.Tables.Length; i++) { SQLText.AppendFormat("select 1 from {0} where 1=0", SharedDataInfo.Tables[i]); if (i != SharedDataInfo.Tables.Length - 1) SQLText.Append(" union all "); } NotifierCommand = NotifierConnection.CreateCommand(SQLText.ToString()); Notifier.AddCommandDependency(NotifierCommand); ConfigureCommand(NotifierCommand); NotifierCommand.ExecuteReader(); NotifierCheckThread = new Thread(CheckNotifier); NotifierCheckThread.IsBackground = true; NotifierCheckThread.Start(); Log.Message("Поток контроля нотификатора запущен. ThreadID: {0}", NotifierCheckThread.ManagedThreadId); }