- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到需要创建一个支持多个数据库的应用程序的情况。多个数据库意味着客户端可以首先使用Oracle,SQL Server,MySQL,PostgreSQL等任何数据库。
我正在尝试使用NHibernate或MyBatis之类的ORM。但是它们有局限性,需要专业知识才能使用。
因此,我决定使用Microsoft提供的数据提供程序,例如ADO.NET,OLEDB,ODP.NET等。
有什么办法可以使我的数据库逻辑对于所有数据库保持相同?我试过IDbConeection
,IDbCommand
等,但是在Oracle(参考光标)的情况下它们有问题。
我有什么办法可以做到这一点?一些链接或指南,将不胜感激。
编辑:
DBType存在问题,因为对于不同的数据提供者,它们的枚举定义不同。
最佳答案
好吧,现实生活中的应用程序是如此复杂。在不知不觉中,您想要用一个应用程序替换UI,将您的逻辑公开为WCF服务,与另一服务提供商一起更改电子邮件服务,在模拟DAL的同时测试代码片段,并与另一服务提供商一起更改数据库。
解决此问题的通常方法是通过将实现与调用者分开的接口传递所有调用。之后,您可以实现不同的DAL。
我个人通常使用这种方法:
首先创建一个包含所有接口的DLL。基本上,该想法是通过界面公开您的UI,App或任何需要的所有调用。从现在开始,您的UI不再与数据库或电子邮件提供商对话。
如果需要访问该界面,请使用工厂模式。切勿使用“新”;从长远来看,这会给您带来麻烦。
创建这个并非易事,需要适当的技巧。通常,我以一个最低的最低版本开始,将用户界面中的所有其他内容作为第一个版本,然后将与数据库或服务相关的所有内容移至正确的项目中,同时创建界面,最后对所有内容进行重新设计,直到我对100%满意为止。
接口应持久耐用。当然,随着时间的流逝会发生变化,但是您确实希望将这些变化最小化。考虑一下未来会怎样,继续阅读别人提出的建议,并确保您的界面能够反映出来。
基本上,您现在拥有一个可以与单个数据库,邮件提供程序等一起使用的软件,到目前为止,一切都很好。
接下来,重新设计工厂。基本上,您希望使用配置设置为数据选择正确的提供程序(实现您的接口的正确DLL)。在大多数情况下,简单的开关就足够了。
在这一点上,我通常习惯于对接口进行大量的单元测试。
最后一步是为不同的数据库提供程序创建DLL。其中之一将在运行时加载到您的应用程序中。
我喜欢简单的Linq而不是SQL(我也使用LinqConnect的库),因为它非常快。我只是从复制粘贴另一个数据库提供程序开始,然后对其进行重新设计,直到它起作用为止。我个人不再相信神奇的“支持所有sql数据库”解决方案:根据我的经验,某些数据库处理某些查询的速度比其他数据库快得多,这意味着您可能最终会获得一些自定义代码,无论如何,每个数据库。
这也是您的单元测试将真正获得回报的地方。基本上,您可以从复制粘贴开始并进行测试。如果幸运的话,一切都将立即以不错的性能运行...如果没有,您知道从哪里开始。
建立到最后
建立持久的东西。事情将会改变:
考虑更新并进行测试。首选自动测试。
您不想每天都修改工厂。使用反射,表达式,代码生成或任何有毒的东西,可以避免更改代码的麻烦。
花时间编写测试。确保覆盖大部分。我不能足够强调这一点;在压力下,人们通常不编写测试来“节省”时间。您会注意到,这次,您的“保存”将在您上线时再次获得支持。每个月。
实体框架呢
因此,我已经看到许多客户在性能方面遇到麻烦。在多次测试中,我都有相同的经历。我注意到客户围绕EF进行大量查询,从而获得了不错的性能。
公平地说,我几年前就放弃了,我知道他们已经在性能上做出了很大的改进。不过,在考虑之前,我会先对其进行测试(尤其是使用复杂的查询)。
如果我要使用EF,则可以在“数据库通用DLL”中实现所有EF东西,然后从中派生类。正如我所说,并不是所有数据库的查询都相同-您可能想要实现一些必要的技巧,以取得良好的性能。您的测试会告诉您。
奖金
通过接口进行编程的其他原因与代理的结合具有很多优势。仅举几例,您只需实现同一接口即可轻松创建日志接收器,缓存,统计信息,WCF等。而且,如果最终某天讨厌当前的OR映射器,则可以将其扔掉而无需触摸应用程序的任何一行。
关于c# - 如何创建支持多个数据库的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37612234/
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!