如何捕获从数据库到 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);
}
}
我正在尝试使用 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);
}
}