如何创建支持多个数据库的应用程序

शेख*_*ेखर 3 c# asp.net orm ado.net multi-database

我遇到需要创建一个支持多个数据库的应用程序的情况。多个数据库意味着客户端可以首先使用Oracle,SQL Server,MySQL,PostgreSQL等任何数据库。

我正在尝试使用NHibernate或MyBatis之类的ORM。但是它们有局限性,需要专业知识才能使用。

因此,我决定使用Microsoft提供的数据提供程序,例如ADO.NET,OLEDB,ODP.NET等。

有什么办法可以使我的数据库逻辑对于所有数据库保持相同?我已经尝试过了IDbConeectionIDbCommand等等,但是在Oracle(Ref Cursor)的情况下它们有问题。

我有什么办法可以做到这一点?一些链接或指南,将不胜感激。

编辑:
DBType存在问题,因为它们的枚举对不同的数据提供程序进行了不同的定义。

atl*_*ste 5

好吧,现实生活中的应用程序是如此复杂。在不知不觉中,您想要用一个应用程序替换UI,将您的逻辑公开为WCF服务,与另一服务提供商一起更改电子邮件服务,在模拟DAL的同时测试代码段,并与另一服务提供商一起更改数据库。 。

解决此问题的常用方法是通过将实现与调用者分开的接口传递所有调用。之后,您可以实现不同的DAL。

我个人通常使用这种方法:

  • 首先创建一个包含所有接口的DLL。基本上,该想法是通过界面公开您的UI,App或任何需要的所有调用。从现在开始,您的UI不再与数据库或电子邮件提供商对话。
  • 如果需要访问该界面,请使用工厂模式。切勿使用“新”;从长远来看,这会给您带来麻烦。
  • 创建这个并非易事,需要适当的技巧。通常,我从一个最低的最低版本开始,将用户界面中的所有其他内容作为第一个版本,然后将与数据库或服务相关的所有内容移至正确的项目中,同时创建界面,最后对所有内容进行重新设计,直到我对100%满意为止。
  • 接口应持久耐用。当然,随着时间的流逝会发生变化,但是您确实希望将这些变化最小化。考虑一下未来会怎样,继续阅读别人提出的建议,并确保您的界面能够反映出来。

基本上,您现在拥有一个可以与单个数据库,邮件提供程序等一起使用的软件,到目前为止,一切都很好。

接下来,重新设计工厂。基本上,您希望使用配置设置为数据选择正确的提供程序(实现您的接口的正确DLL)。在大多数情况下,简单的开关就足够了。

在这一点上,我通常习惯于对接口进行大量的单元测试。

最后一步是为不同的数据库提供程序创建DLL。其中之一将在运行时加载到您的应用程序中。

我喜欢简单的Linq而不是SQL(我也使用LinqConnect的库),因为它非常快。我只是从复制粘贴另一个数据库提供程序开始,然后对其进行重新设计,直到它起作用为止。我个人不相信神奇的“支持所有sql数据库”解决方案:根据我的经验,某些数据库处理某些查询的速度比其他数据库快得多,这意味着您可能最终会获得一些自定义代码,无论如何,每个数据库。

这也是您的单元测试将真正获得回报的地方。基本上,您可以从复制粘贴开始并进行测试。如果幸运的话,一切都将立即以不错的性能运行...如果没有,您知道从哪里开始。

建立到最后

建立持久的东西。事情将会改变:

  • 考虑更新并进行测试。首选自动测试。
  • 您不想每天都修改工厂。使用反射,表达式,代码生成或任何有毒的东西,可以避免更改代码的麻烦。
  • 花时间编写测试。确保覆盖大部分。我不能足够强调这一点;在压力下,人们通常不编写测试来“节省”时间。您会注意到,这次,您的“保存”将在您上线时再次获得支持。每个月。

实体框架呢

因此,我已经看到许多客户在性能方面遇到麻烦。在多次测试中,我都有相同的经历。我注意到客户围绕EF进行大量查询,从而获得了不错的性能。

公平地说,我几年前就放弃了,我知道他们已经对性能进行了相当大的改进。不过,在考虑之前,我会先对其进行测试(尤其是复杂查询)。

如果我要使用EF,则可以在“数据库通用DLL”中实现所有EF东西,然后从中派生类。正如我所说,并不是所有数据库的查询都相同-您可能想要实现一些必要的技巧,以取得良好的性能。您的测试会告诉您。

奖金

通过接口进行编程的其他原因与代理相结合具有很多优势。仅举几例,您只需实现同一接口即可轻松创建日志接收器,缓存,统计信息,WCF等。而且,如果最终有一天您讨厌当前的OR映射器,则可以将其丢弃而无需触摸应用程序的任何一行。