如何捕获从数据库到 C# 的事件(聊天应用程序)

How to catch an event coming from database to C# (chat application)

我正在尝试使用 Visual C# 和 firebird / MySQL 作为数据库开发聊天应用软件。

当客户端A发送消息时,我想让客户端B得到通知。

如何从数据库通知客户端 B 有消息正在等待?

假设我在我的数据库中创建了一个事件 table,当对消息 table 进行插入时,我将如何在 C# 中捕获数据库生成的消息?

谁能指导我应该在 C# 中使用什么代码来捕获数据库的通知并将其显示给客户端 B?

下面是一个非常简单的事件处理程序,它来自 Firebird .NET - Examples of use

copied/modified

处理事件的class是FbRemoteEvent。您在实例上注册您感兴趣的事件,并添加事件处理程序以在事件发生时收到通知。事件是异步通知的(尽管示例没有清楚地说明这一点)。事件计数是自上次(已处理)事件通知以来的事件数。

为了简化示例,我使用了一个执行块来直接 post 事件(而不是 - 例如 - post 来自触发器的事件)。请注意,在此示例中,连接会通知自己事件,但如果通知来自不同的连接,它的工作方式将完全相同:

class Program
{
    static void Main(string[] args)
    {
        FbConnectionStringBuilder cs = new FbConnectionStringBuilder();
        cs.DataSource = "localhost";
        cs.Database = @"TESTDATABASE.FDB";
        cs.UserID = "SYSDBA";
        cs.Password = "masterkey";
        cs.Charset = "NONE";
        cs.Pooling = false;

        FbConnection connection = new FbConnection(cs.ToString());
        connection.Open();

        FbRemoteEvent revent = new FbRemoteEvent(connection);
        revent.AddEvents(new string[] { "new_order" });

        // Add callback to the Firebird events
        revent.RemoteEventCounts += new FbRemoteEventEventHandler(EventCounts);

        // Queue events
        revent.QueueEvents();

        string sql = "EXECUTE BLOCK AS BEGIN POST_EVENT 'new_order'; END";

        FbCommand command = new FbCommand(sql, connection);

        for (int i = 0; i < 5; i++)
        {
            command.ExecuteNonQuery();
        }

        System.Threading.Thread.Sleep(2000);
        connection.Close();
        Console.ReadLine();
    }

    static void EventCounts(object sender, FbRemoteEventEventArgs args)
    {
        Console.WriteLine("Event {0} has {1} counts.", args.Name, args.Counts);
    }
}