Table of Contents

Class DatabaseDependency

Namespace
Cuemon.Data
Assembly
Cuemon.Data.dll

Provides a way to monitor any changes occurred to one or more relational data sources while notifying subscribing objects.

public class DatabaseDependency : Dependency, IDependency
Inheritance
DatabaseDependency
Implements
Inherited Members

Examples

The following example demonstrates how to use to monitor a relational data source for changes and notify dependent objects. It sets up a Lazy<DatabaseWatcher> with a stub connection and a command that executes SELECT COUNT(*) FROM Products, then creates a DatabaseDependency with a change event handler that writes to the console. The dependency is started asynchronously, showing how to watch a relational data source for data-change notifications.

using System;
using System.Data;
using System.Threading.Tasks;
using Cuemon.Data;
using Cuemon.Runtime;

namespace MyApp.Examples;

public class DatabaseDependencyExample
{
    public async Task DemonstrateAsync()
    {
        var lazyWatcher = new Lazy<DatabaseWatcher>(() =>
        {
            var connection = new StubConnection();
            return new DatabaseWatcher(
                connection,
                conn =>
                {
                    var command = conn.CreateCommand();
                    command.CommandText = "SELECT COUNT(*) FROM Products";
                    return command.ExecuteReader();
                });
        });

        var dependency = new DatabaseDependency(lazyWatcher, breakTieOnChanged: true);

        dependency.DependencyChanged += (sender, args) =>
        {
            Console.WriteLine("Database data has changed!");
        };

        await dependency.StartAsync();
    }

    private sealed class StubConnection : IDbConnection
    {
        public string ConnectionString { get; set; }
        public int ConnectionTimeout => 30;
        public string Database => "MyDb";
        public ConnectionState State => ConnectionState.Closed;
        public IDbTransaction BeginTransaction() => null;
        public IDbTransaction BeginTransaction(IsolationLevel il) => null;
        public void ChangeDatabase(string databaseName) { }
        public void Close() { }
        public IDbCommand CreateCommand() => new StubCommand();
        public void Open() { }
        public void Dispose() { }
    }

    private sealed class StubCommand : IDbCommand
    {
        public string CommandText { get; set; }
        public int CommandTimeout { get; set; }
        public CommandType CommandType { get; set; }
        public IDbConnection Connection { get; set; }
        public IDataParameterCollection Parameters => null;
        public IDbTransaction Transaction { get; set; }
        public UpdateRowSource UpdatedRowSource { get; set; }
        public bool DesignTimeVisible { get; set; }
        public void Cancel() { }
        public IDbDataParameter CreateParameter() => null;
        public int ExecuteNonQuery() => 0;
        public IDataReader ExecuteReader() => null;
        public IDataReader ExecuteReader(CommandBehavior behavior) => null;
        public object ExecuteScalar() => 0;
        public void Prepare() { }
        public void Dispose() { }
    }
}

Constructors

DatabaseDependency(IEnumerable<Lazy<DatabaseWatcher>>, bool)

Initializes a new instance of the DatabaseDependency class.

public DatabaseDependency(IEnumerable<Lazy<DatabaseWatcher>> lazyDatabaseWatchers, bool breakTieOnChanged = false)

Parameters

lazyDatabaseWatchers IEnumerable<Lazy<DatabaseWatcher>>

The DatabaseWatcher sequence to associate with this dependency.

breakTieOnChanged bool

if set to true all DatabaseWatcher instances is disassociated with this dependency after first notification of changed.

Remarks

The sequence of DatabaseWatcher initializations is deferred until StartAsync() is invoked.

DatabaseDependency(Lazy<DatabaseWatcher>, bool)

Initializes a new instance of the DatabaseDependency class.

public DatabaseDependency(Lazy<DatabaseWatcher> lazyDatabaseWatcher, bool breakTieOnChanged = false)

Parameters

lazyDatabaseWatcher Lazy<DatabaseWatcher>

The DatabaseWatcher to associate with this dependency.

breakTieOnChanged bool

if set to true all DatabaseWatcher instances is disassociated with this dependency after first notification of changed.

Remarks

The DatabaseWatcher initialization is deferred until StartAsync() is invoked.

Exceptions

ArgumentNullException

lazyDatabaseWatcher cannot be null.

See Also