/// <summary> /// Handler for dealing with error conditions coming from the database /// </summary> /// <param name="mon"></param> /// <param name="args"></param> static void OnDataError(DataMonitor mon, SqlNotificationEventArgs args) { log.ErrorFormat("Invalid Query for SqlDependency"); }
/// <summary> /// Ask the manager to add a new Data Monitor to the collection. /// [NOTE: The parms are BITS-oriented but can be any app-specific wrapper /// used to pass in the details required to instantiate the Data Monitor(s)] /// </summary> /// <param name="job"></param> /// <param name="dmDetails"></param> public void AddDataMonitor(IJob job, DataMonitorDetails dmDetails) { #region early return if (_dmDictionary.ContainsKey(dmDetails.JobKeyCode)) { log.WarnFormat("Attempting to re-add existing Data Monitor."); return; } // test connection to database if (!DatabaseUtils.Connect(dmDetails.ConnectionString)) throw new ApplicationException("Database connection not established."); #endregion //keep a list of server connection strings AddServerConnection(dmDetails.ConnectionString); // here's the juice DataMonitor dm = new DataMonitor(dmDetails.ConnectionString, dmDetails.QueryString, dmDetails.CommandType); lock (s_lock) { dm.Id = dmDetails.JobKeyCode; //[Note: This is BITS-specific but any name can be provided.] dm.OnError += OnDataError; dm.OnData += OnData; _dmDictionary[dmDetails.JobKeyCode] = dm; _dmDetailsDictionary[dmDetails.JobKeyCode] = dmDetails; _dmDictionary[dmDetails.JobKeyCode].Start(); } }
/// <summary> /// Primary handler for dealing with new data /// [BITS-specific: Note that while the content is BITS-specific, this handler is absolutely necessary to deal /// with new data from the database.] /// </summary> /// <param name="mon"></param> /// <param name="dt"></param> static void OnData(DataMonitor mon, DataTable dt) { DataMonitorDetails dmd = DataMonitorManager.InstanceOf()._dmDetailsDictionary[mon.Id]; ExecutionEngine.InstanceOf().DataMonitorTrigger(dmd, dt); }