コード例 #1
0
        private void Poll()
        {
            // Current values
            var currentChanges = new Dictionary <SqlDependencyQualifiedObjectName, SqlDependencyMonitoredChanges>();

            // Open connection
            using (var conn = new SqlConnection(Parameters.ConnectionString))
            {
                // Ensure open
                Helper.EnsureOpenConnection(conn);

                // Command Text
                var cmdText = string.Format(CultureInfo.InvariantCulture,
                                            @"SELECT * FROM {0} WHERE [ObjectId] IN ({1})",
                                            Parameters.Options.ChangeHolderTable,
                                            string.Join(", ", Parameters.Tables.Select(t => string.Format(CultureInfo.InvariantCulture,
                                                                                                          @"OBJECT_ID('{0}')", t))));

                // Execute
                using (var cmd = new SqlCommand(cmdText, conn))
                {
                    cmd.CommandType = CommandType.Text;
                    using (var dataReader = cmd.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            // Get object details
                            var objectName = dataReader["ObjectName"] as string;
                            var table      = Parameters.Tables.SingleOrDefault(t => t.FullName.Equals(objectName, StringComparison.OrdinalIgnoreCase));
                            if (table == null)
                            {
                                continue;
                            }

                            // Get current dates
                            var lastInsertDate = Helper.GetNullableFieldValue <DateTimeOffset>(dataReader, "LastInsertDate");
                            var lastUpdateDate = Helper.GetNullableFieldValue <DateTimeOffset>(dataReader, "LastUpdateDate");
                            var lastDeleteDate = Helper.GetNullableFieldValue <DateTimeOffset>(dataReader, "LastDeleteDate");

                            // Previous dates
                            Tuple <DateTimeOffset?, DateTimeOffset?, DateTimeOffset?> prevDates;
                            if (!_previousChanges.TryGetValue(table, out prevDates))
                            {
                                // ReSharper disable once RedundantAssignment
                                prevDates = null;
                            }

                            // Set Changes to none
                            currentChanges[table] = SqlDependencyMonitoredChanges.None;

                            // Check what has changed
                            if (((Parameters.MonitoredChanges & SqlDependencyMonitoredChanges.Insert) == SqlDependencyMonitoredChanges.Insert) &&
                                lastInsertDate.HasValue)
                            {
                                if ((prevDates?.Item1 == null) ||
                                    (lastInsertDate.Value > prevDates.Item1.Value))
                                {
                                    currentChanges[table] |= SqlDependencyMonitoredChanges.Insert;
                                }
                            }
                            if (((Parameters.MonitoredChanges & SqlDependencyMonitoredChanges.Update) == SqlDependencyMonitoredChanges.Update) &&
                                lastUpdateDate.HasValue)
                            {
                                if ((prevDates?.Item2 == null) ||
                                    (lastUpdateDate.Value > prevDates.Item2.Value))
                                {
                                    currentChanges[table] |= SqlDependencyMonitoredChanges.Update;
                                }
                            }
                            if (((Parameters.MonitoredChanges & SqlDependencyMonitoredChanges.Delete) == SqlDependencyMonitoredChanges.Delete) &&
                                lastDeleteDate.HasValue)
                            {
                                if ((prevDates?.Item3 == null) ||
                                    (lastDeleteDate.Value > prevDates.Item3.Value))
                                {
                                    currentChanges[table] |= SqlDependencyMonitoredChanges.Delete;
                                }
                            }

                            // Update previous changes data
                            _previousChanges[table] = new Tuple <DateTimeOffset?, DateTimeOffset?, DateTimeOffset?>(lastInsertDate, lastUpdateDate, lastDeleteDate);
                        }
                    }
                }
            }

            // Fire changes
            currentChanges
            .Where(kv => kv.Value != SqlDependencyMonitoredChanges.None)
            .ToList().ForEach(kv => FireTableChangedEvent(kv.Key, kv.Value));
        }