示例#1
0
        internal void ValidateAndAdjust()
        {
            // Connection string
            if (ConnectionString == null)
            {
                // ReSharper disable once NotResolvedInText
                throw new ArgumentNullException("SqlDependencyProvider.Parameters.ConnectionString");
            }

            // Tables
            var tableInfos = new List <SqlDependencyQualifiedObjectName>(Tables);

            tableInfos = tableInfos
                         .Where(p => p?.Name != null)
                         .Distinct()
                         .ToList();
            if (tableInfos.Count == 0)
            {
                // ReSharper disable once NotResolvedInText
                throw new ArgumentNullException("SqlDependencyProvider.Parameters.Tables");
            }
            Tables.Clear();
            Tables.AddRange(tableInfos.OrderBy(p => p.Schema, StringComparer.OrdinalIgnoreCase)
                            .ThenBy(p => p.Name, StringComparer.OrdinalIgnoreCase));

            // Monitored changes
            if (MonitoredChanges == SqlDependencyMonitoredChanges.None)
            {
                // ReSharper disable once NotResolvedInText
                throw new ArgumentNullException("SqlDependencyProvider.Parameters.MonitoredChanges");
            }

            // Check all monitored tables exist
            using (var conn = new SqlConnection(ConnectionString))
            {
                // Ensure open
                Helper.EnsureOpenConnection(conn);

                // Check
                var nonExistingTableNames = new List <string>();
                if (!Tables.Any(t =>
                {
                    if (!Helper.TableExists(conn, null, t))
                    {
                        nonExistingTableNames.Add(t.ToString());
                        return(false);
                    }
                    return(true);
                }))
                {
#if USETRANSLATIONS
                    throw new InvalidOperationException(
                              Translations.Default["SText_SqlDependencyOneOrMoreMonitoredTablesDoNotExist_Names",
                                                   string.Join(", ", nonExistingTableNames)]);
#else
                    throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture,
                                                                      Resources.SText_SqlDependencyOneOrMoreMonitoredTablesDoNotExist_Names,
                                                                      string.Join(", ", nonExistingTableNames)));
#endif
                }
            }
        }
        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));
        }