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

时间:2016-06-03 10:41:37

标签: c# asp.net orm ado.net multi-database

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

我试图使用像NHibernate或MyBatis这样的ORM。但他们有其局限性,需要专业知识才能使用。

所以我决定使用微软提供的数据提供商,如ADO.NET,OLEDB,ODP.NET等。

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

我有什么方法可以实现这个目标吗?一些链接或指南将不胜感激。

编辑:
DBTypes存在问题,因为它们是enum,对不同的数据提供者进行了不同的定义。

4 个答案:

答案 0 :(得分:4)

嗯,现实生活中的应用程序很复杂。在您知道它之前,您希望用应用程序替换UI,将您的逻辑公开为WCF服务,使用其他服务提供商更改电子邮件服务,在模拟DAL时测试代码片段并使用另一个更改数据库。

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

就我个人而言,我通常采用这种方法:

  • 首先创建一个包含所有接口的DLL。基本上,我们的想法是通过界面公开您的UI,App或其他任何需要的所有调用。从现在开始,您的UI不再与数据库或电子邮件提供商交谈。
  • 如果您需要访问界面,则使用工厂模式。永远不要使用'新';从长远来看,这会让你陷入困境。
  • 创造这个并不简单,需要适当的制作。通常我从一个最低限度版本开始,在UI中作为第一个版本破解其他所有内容,然后在创建界面时将触及数据库或服务的所有内容移动到正确的项目中,最后重新设计所有内容,直到我100%满意为止。
  • 接口应该建立持久。当然,随着时间的推移会发生变化,但你真的希望尽量减少这些变化。想想未来将会发生什么,阅读其他人提出的建议,并确保您的界面反映出来。

基本上你现在有一个可以与单个数据库,邮件提供商等一起工作的软件。到目前为止一直很好。

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

此时我通常养成对接口进行大量单元测试的习惯。

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

我更喜欢简单的Linq到SQL(我也使用LinqConnect中的库),因为它非常快。我只是从复制粘贴其他数据库提供程序开始,然后重新设计它直到它工作。就个人而言,我不相信魔法'支持所有sql数据库'的解决方案:根据我的经验,一些数据库将处理某些查询的速度比其他数据库快得多 - 这意味着你可能最终得到一些自定义代码反正每个数据库。

这也是您的单元测试真正得到回报的关键。基本上,您可以从复制粘贴开始并进行测试。如果你很幸运,一切都将立即运行,表现不错......如果没有,你知道从哪里开始。

构建到最后

把事情做好。事情会发生变化:

  • 考虑更新并测试它们。喜欢自动测试。
  • 你不想每天都修补你的工厂。使用反射,表达式,代码生成或任何毒药来节省更改代码的麻烦。
  • 花时间写测试。确保你覆盖了整体。我不能强调这一点;在压力下,人们通常不会写测试来“节省”时间。你会注意到,这次你'保存'会在你上线时再次作为支持。每个月。

实体框架

我见过很多客户因此而遇到性能问题。在我测试它的很多次,我有相同的经验。我注意到客户在EF周围进行了很多查询,以获得一些不错的性能。

公平地说,几年前我放弃了,我知道他们已经取得了相当大的性能提升。不过,在考虑它之前,我会测试它(特别是复杂的查询)。

如果我会使用EF,我会在'数据库通用DLL'中实现所有EF内容,然后从中派生类。正如我所说的,并非所有数据库都与查询相同 - 您可能希望实现一些必要的黑客攻击以获得不错的性能。你的测试会告诉你。

<强>奖金

通过接口编程的其他原因与代理相结合具有很多优势。仅举几例,您可以通过简单地实现相同的界面轻松创建日志接收器,缓存,统计信息,WCF等。如果你有一天最终讨厌你现在的OR映射器,你可以扔掉它而不用触及你的应用程序的一行。

答案 1 :(得分:0)

我相信Microsoft的数据访问组件适合您。 https://en.wikipedia.org/wiki/Microsoft_Data_Access_Components

答案 2 :(得分:0)

enter image description here

如何使用rest api编写微服务并连接它们? 您(也许您的团队)可以提供处理逻辑和ui的核心应用程序。这仍然基于您当前的技术。但是,您可以提供多种类型的微服务(基于asp.net或核心),而不是直接添加某种数据库连接,从而提供休息API。您可以从这样的微服务中获取每个数据库中的数据。因此,您将开发1个微服务,例如MySQl和另一个用于MsSQL,当一​​个新客户提出oracle时,你会编写一个新的小型微服务来处理你期望的API。

更多信息(基于.net核心)在这里:https://docs.asp.net/en/latest/tutorials/first-web-api.html

我认为这是一个团队讨论,你决定使用哪种技术。但今天我建议写一个微服务。它会为例如新应用程序附加新应用程序。移动设备也更容易:)

答案 3 :(得分:0)

是的,可能。

现在正在使用相同的场景,我的所有逻辑相关数据(通常可以调用元数据)驻留在一个数据库中,而日期驻留在另一个数据库中。

你需要做什么。你应该在两个不同的文件中有连接相关的参数,或者你可以将这些文件称为prop文件。现在你需要有连接具体类,它从这些prop文件中获取参数。因此,您需要创建连接只需提供prop文件,它将根据需要创建数据库连接。