C# 在Postgres SQL连接失败时,本地保存数据的选项有哪些

C# 在Postgres SQL连接失败时,本地保存数据的选项有哪些,c#,entity-framework,postgresql,database-connection,C#,Entity Framework,Postgresql,Database Connection,我正在构建一个C#应用程序,它在云中使用PostgresSQL数据库(版本9.3)进行存储。虽然我的办公室连接是光纤连接,对于db提供商来说非常稳定,但对于我的客户来说可能不是这样 我使用的是Devart Entity Developer edition 5.5.164,当然还有点连接PostgreSQL提供程序 问题是,如果在使用应用程序时与数据库的连接失败,那么有哪些易于实现的选项可以将当前状态保存到PC(如果有)本地其次,当数据库恢复联机时,有哪些同步选项可用于确保本地PC上的数据成功写入

我正在构建一个C#应用程序,它在云中使用PostgresSQL数据库(版本9.3)进行存储。虽然我的办公室连接是光纤连接,对于db提供商来说非常稳定,但对于我的客户来说可能不是这样

我使用的是Devart Entity Developer edition 5.5.164,当然还有点连接PostgreSQL提供程序

问题是,如果在使用应用程序时与数据库的连接失败,那么有哪些易于实现的选项可以将当前状态保存到PC(如果有)本地其次,当数据库恢复联机时,有哪些同步选项可用于确保本地PC上的数据成功写入数据库

我考虑过一种主从PostgreSQL类型的设置,其中本地机器被设置为提供DB服务,然后将每个更改复制到云。但是客户端不希望管理另一个系统。所以这不是一个选择


所以。。。有什么想法吗?

我认为本地sqlite数据库可能是一个解决方案

  • 远优于自制的文件存储解决方案
  • 没有额外的管理费用,它是磁盘上的一个文件
  • 库可轻松集成到您的程序中
  • SQL接口将导致很少的代码重复
然后你可以遵循这样的策略:

  • 本地提交优先,通常非常快
  • 然后远程提交
  • 如果提交,请删除本地数据
  • 在程序启动时,将本地数据存储到云中
等等


编辑:刚刚检查过,Devart Entity Developer支持sqlite:-)

虽然解决此问题的所有建议都经过了深思熟虑,但我决定序列化数据,并在检测到连接失败时保存它。这在我的例子中是有效的,因为当客户端创建/更新记录时,系统只修改了几个表(六个)。在执行最后的“保存数据”操作之前,我会重试连接3次,然后锁定系统,以便最终用户收到通知,在数据连接稳定之前无法进行进一步更改。序列化数据的过程非常简单,很容易完成

以下是一个小样本,供感兴趣的人参考:

 var backupfile = String.Format("ModifiedGridTotals_Backup_{0}.xml", DateTime.Now.ToString("d-MMM-yyyy-HHmmss"));
 var serializer = new XmlSerializer(typeof(List<GridTotal>));
 serializer.Serialize(new XmlTextWriter(backupfile, Encoding.UTF8), ModifiedGridTotals);
var backupfile=String.Format(“ModifiedGridTotals_Backup_u{0}.xml”,DateTime.Now.ToString(“d-MMM-yyyy-HHmmss”);
var serializer=newxmlserializer(typeof(List));
serializer.Serialize(新的XmlTextWriter(备份文件,Encoding.UTF8),ModifiedGridTotals);
恢复数据库连接后,我从磁盘读回这些文件并提交更改

我尝试了SQLite PostgreSQL on/offline设置。根据我的经验,我强烈建议考虑:

  • 离线和在线(1个或n个表,只需插入或更新(冲突危险!)之间同步的数据(基数)有多大
  • 您在每个SQLite和PostgreSQL中使用的数据类型?它们是否兼容
  • 您是否有一个工具可以使从一种DB语言到另一种DB语言的“翻译”变得容易

  • 我最终决定在Postgres上运行一切。与此同时,这带来了新的挑战:大师之间的同步。冲突问题通过it系统外的组织责任得到解决。

    这是个好主意,但客户不希望另一个系统在本地管理。因此我需要在我的当它检测到失败的连接时,应用程序。由于我使用的是数据库层的实体框架,也许我可以将当前信息写入磁盘并保存,直到连接恢复。只是想找到一个好的解决方案。数据库的性质是什么?它只是插入?还是更新/删除记录?Mig另一个客户端也离线更新/删除相同的记录吗?换句话说,你只需要一个动作日志,还是还需要冲突检测?Craig,这是一个读/写的情况,但用户只能打开一组记录。所以动作日志可能会起作用。有趣的想法,我必须研究sqlite到postgreSQL syncin看看这样做涉及到什么。