c# - 以统一的方式查询不同数据库引擎的最佳方法?

标签 c# sql database portability

我正在开发一个 C# 客户端应用程序 ( SlimTune Profiler ),该应用程序使用关系(可能是嵌入式)数据库引擎作为其后备存储。当前版本已经可以处理 SQLite 和 SQL Server Compact,我想尝试支持其他系统,如 MySQL、Firebird 等。更糟糕的是,我希望它支持任何其他后备数据存储的插件 - 理想情况下不一定是基于 SQL 的插件。最重要的是,前端本身支持插件,因此我在查询代码和处理查询的引擎之间有一个未知的多对多映射。

现在,查询基本上是通过原始 SQL 代码处理的。我已经在使复杂的 SELECT 以可移植的方式工作时遇到了麻烦。随着时间的推移,这个问题只会变得更糟,而且这还不考虑支持非 SQL 数据的想法。那么,以合理的方式查询完全不同的引擎的最佳方法是什么?

我考虑过一些基于 LINQ 的东西,可能是 DbLinq项目。另一个选择是对象持久性框架,Subsonic例如。但我不太确定那里有什么,有什么限制,或者我是否只是希望太多。

(顺便说一句,对于为什么我不选择一个引擎这一不可避免的问题。我喜欢让用户选择最适合他们的引擎。SQL Compact 允许复制到完整的 SQL Server 实例。SQLite是可移植的并且支持内存数据库。我可以想象这样一种情况:一家公司想要添加一个 MySQL 插件,以便他们可以轻松地存储和整理应用程序在一段时间内的性能数据。最后也是最重要的是,我发现我认为我应该依赖于底层数据库引擎的实现细节的想法是荒谬的。)

最佳答案

最好的选择是使用一个接口(interface)来进行所有数据库访问。然后,对于您想要支持的每种数据库类型,执行该数据库的接口(interface)的实现。这就是我过去必须为项目做的事情。

许多数据库系统和存储工具的问题在于它们旨在解决不同的问题。您甚至可能不想将数据存储在 SQL 数据库中,而是将其作为文件存储在 Web 应用程序的 App_Data 文件夹中。使用接口(interface)方法,您可以很容易地做到这一点。

通常没有一种解决方案能够很好地适合所有数据库和存储解决方案,甚至无法很好地适合其中的一些解决方案。如果你找到一个声称确实如此的人,我仍然不会相信它。当您的某个数据库出现问题时,您挖掘自己的对象比挖掘他们的对象要容易得多。

关于c# - 以统一的方式查询不同数据库引擎的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2329539/

相关文章:

database - 寻找多语言开源翻译词典平面文件或数据库

c# - 在 WPF 项目中更改 Main

c# - 在将 Html 转换为 Pdf 时显示 Unicode 字符

sql - 帮助基本的 SQL QUERY

mysql - 如何在sql中每天一次执行触发器

SQL 与 noSQL(速度)

c++ - 我应该使用文件系统还是数据库将我的数据存储在我的音乐识别应用程序中?

c# - 使用表达式将 'Cast' Func<object, object> 转换为 Func<T, TRet>

c# - : Must contain a numeric, 的正则表达式不包括 "SomeText1"

php - 在 Codeigniter 中连接第二个数据库时出现问题