今天我编写了以下代码,它与名为 Npgsql 的 PostgreSQL C# 库一起使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
namespace PostgreSQLNotificationsTest
{
class Program
{
static void Main(string[] args)
{
using (var conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=my_password;Database=helper_db.psql;SyncNotification=true"))
{
conn.Notification += OnNotification;
conn.Open();
using (var command = new NpgsqlCommand("listen notifytest;", conn))
{
command.ExecuteNonQuery();
}
Console.ReadLine();
};
}
private static void OnNotification(object sender, NpgsqlNotificationEventArgs e)
{
Console.WriteLine("event handled: " + e.AdditionalInformation);
}
}
}
然后我执行以下操作
createdb.exe -h 127.0.0.1 -p 5432 -U postgres -W helper_db.psql
psql.exe -h 127.0.0.1 -p 5432 -U postgres -W helper_db.psql
创建表助手(第一个文本主键,第二个整数);
CREATE OR REPLACE FUNCTION nf() RETURNS TRIGGER AS $$
BEGIN
PERFORM pg_notify('notifytest', format('INSERT %s %s', NEW.first, NEW.second));
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER any_after AFTER INSERT OR UPDATE OR DELETE ON helper FOR EACH ROW EXECUTE PROCEDURE nf();
插入辅助值('first', 10), ('second', 20);
在 C# 项目中,我得到以下输出:
处理的事件:插入前 10
没有“事件处理:插入秒 20”。只有当我执行“从助手中删除”之类的下一个操作时,我才会收到它。
为什么?