我有两个共享一个SQLite数据库文件的C#程序。
一个程序(让我们称之为Writer)将新数据写入数据库。另一个程序(Reader)读取它。两个程序都使用Fluent NHibernate和System.Data.SQLite来访问数据库。
目前,我的Reader程序上只有一个很大的刷新按钮,用户必须单击它才能获取自上次刷新以来写入数据库的任何新数据。这很有效,但很不优雅。
当Writer更新数据库时,有没有办法让NHibernate在Reader程序中触发事件,这样我就可以自动向用户显示新数据了? (我查看了NH拦截器和事件的文档,但目前尚不清楚这些是否符合我的要求)
或者,有没有一种使用NH轮询更新的好方法?
对于NH解决方案失败,我可以使用System.Data.SQLite或其他更低级别的机制执行类似的操作吗?
答案 0 :(得分:1)
我认为作家方面的拦截器或事件将是正确的解决方案。在我们目前的项目中,我们做了类似的事情并且工作得很好 使用这种方法,你可以保持在下面或映射下切换数据库的能力,并且可以从简单的“TableUpdate”触发器中详细说明你的更新事件,我认为应该在几个小时内完成一个包含所有更改的具体Update-Event数据
编辑:
首先,我不仅会跟踪OnSave,还会跟踪AfterTransactionCompleted,以确保交易已经完成。这也使您可以收集tx的所有对象。 最简单的方法是覆盖EmptyInterceptor对象,如下所示:
public class EntityInterceptor : EmptyInterceptor
{
private IList<object> entities = new List<object>();
public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
{
entities.Add(entity);
return base.OnSave(entity, id, state, propertyNames, types);
}
public override void AfterTransactionCompletion(ITransaction tx)
{
if (tx.WasCommitted)
{
Console.WriteLine("Data has been inserted. Notify the reader here.");
}
entities = new List<object>();
}
}
进程间通信IMO最直接的方法是.net远程处理。有几个例子如何做到这一点。可以找到一个简单的here。或者,如果您想尝试WCF,请参阅here。或者搜索SO,可以在这里找到很多好的例子。
答案 1 :(得分:1)
您可以将System.IO.FileWatcher
放到共享文件中。这会告诉你什么时候更新。
答案 2 :(得分:0)
以下是一些使用FileSystemWatcher的示例代码,如John Rayner所建议的那样......
// Watches for writes to database file
private static FileSystemWatcher _dbFileWatcher;
/// <summary>
/// Set up an event handler that is called when SQLite database is written to.
/// </summary>
/// <param name="onChangedHandler"></param>
public static void SetupSqliteDatabaseWatcher(FileSystemEventHandler onChangedHandler)
{
// Create a new FileSystemWatcher and set its properties.
_dbFileWatcher = new FileSystemWatcher
{
Path = "<directory containing DB file>",
Filter = "<DB file>.db",
NotifyFilter = NotifyFilters.LastWrite
};
// Add the event handler
_dbFileWatcher.Changed += onChangedHandler;
// Begin watching.
_dbFileWatcher.EnableRaisingEvents = true;
}
// Event handler
private static void OnDbWritten(object source, FileSystemEventArgs e)
{
Debug.Print("DB written");
}
// Set up the event handler
SetupSqliteDatabaseWatcher(OnDbWritten);