1

我们使用的是 Visual Studio 2010,但这是最初使用 VS2003 构思的。

我会将最好的建议转发给我的团队。目前的设置几乎让我呕吐。这是一个 C# 解决方案,大多数项目都包含 .sql 文件。因为我们支持 Microsoft、Oracle 和 Sybase,所以自制了一个预处理器,很像 C 预处理器,只是替换是由自制的 C# 程序执行的,而不使用yacc类似的工具。#ifdefs用于条件宏定义,是的 - 宏就是这样做的方式。一个宏可以扩展为另一个或两个宏,但这最终应该终止。它们中只有宏#ifdef——其余的类似 SQL 的代码只使用这些宏。

现在,各种配置:Debug, MNDebug, MNRelease, Release, SQL_APPLY_ALL, SQL_APPLY_MSFT, SQL_APPLY_ORACLE, SQL_APPLY_SYBASE, SQL_BUILD_OUTPUT_ALL, SQL_COMPILE,以及另外 2 个。

还有:Any CPU, Mixed Platforms, Win32

让我抓狂的是必须正确配置它以及从配置中选择正确的12 x 3 = 36配置,以及必须根据数据库类型替换数据库名称:配置、主数据库或网关。我认为应该将配置简化为仅 Debug、Release 和 SQL_APPLY。此外,使用 0、1 和 2 似乎是 80 年代......最后,我认为我打算为 3 种类型的供应商构建或不构建 3 种类型的数据库应该只配置一个井字游戏板,例如:

XOX
OOX
XXX

在这种情况下,这意味着构建 MSFT+CONFIG、所有 SYBASE 和所有 GATEWAY。

尽管如此,使用文本文件和预处理器以及许多配置的整体东西似乎非常笨重。现在是 2010 年,肯定会有人拥有非常干净和/或有创意的工具/解决方案。唯一的优点是现有的宏集合已经过很好的测试。

您是否曾经编写过适用于多个供应商的 SQL?你是怎么做到的?


SqlVars.txt(30 个用户中的每个人都制作了一个模板的副本并对其进行修改以满足他们的需要):

// This is the default parameters file and should not be changed.
// You can overwrite any of these parameters by copying the appropriate
// section to override into SqlVars.txt and providing your own information.

//Build types are 0-Config, 1-Main, 2-Gateway
BUILD_TYPE=1

REMOVE_COMMENTS=1

// Login information used when applying to a Microsoft SQL server database
SQL_APPLY_MSFT_version=SQL2005
SQL_APPLY_MSFT_database=msftdb
SQL_APPLY_MSFT_server=ABC
SQL_APPLY_MSFT_user=msftusr
SQL_APPLY_MSFT_password=msftpwd

// Login information used when applying to an Oracle database
SQL_APPLY_ORACLE_version=ORACLE10g
SQL_APPLY_ORACLE_server=oradb
SQL_APPLY_ORACLE_user=orausr
SQL_APPLY_ORACLE_password=orapwd

// Login information used when applying to a Sybase database
SQL_APPLY_SYBASE_version=SYBASE125
SQL_APPLY_SYBASE_database=sybdb
SQL_APPLY_SYBASE_server=sybdb
SQL_APPLY_SYBASE_user=sybusr
SQL_APPLY_SYBASE_password=sybpwd

... (THIS GOES ON)
4

2 回答 2

2

您是否曾经编写过适用于多个供应商的 SQL?你是怎么做到的?

我使用了 ORM 的. 检查NHibernate。由于您使用的是 VS2010,因此您还可以查看MS ADO.Net Entity Framework
ORM 使您能够高度抽象数据库。仍然会有应该为每个 RDBMS 单独手工制作的查询,但根据我的经验,它不到 10%。

对于其他商业和开源 ORM 的检查维基百科文章:对象关系映射软件列表

编辑:重新交易平台评论:

我从来没有做过这样的项目,所以我真的无法给出任何有意义的建议。作为一般建议,ORM 可以帮助您整合数据访问层并最大限度地减少对 RDBMS 特定代码的需求。大多数ORM也可以自动生成数据库。

我无法说出这样的性能损失是多少。您应该使用顶级 ORM(商业和开源)进行一些测试,然后做出决定(微软可能有兴趣与在您的市场中使用实体框架的公司合作)。

另外,不要忘记,在现有产品中引入 ORM 是很困难的,所以这是您需要考虑的另一个问题。

于 2010-06-10T22:11:59.720 回答
0

您是否曾经编写过适用于多个供应商的 SQL?你是怎么做到的?

从根本上说,您可以通过在数据层和任何其他层之间添加一个抽象层来做到这一点。然后你有几个选择:

  1. 使用智能 ORM 构建数据层并考虑数据库特性
  2. 使用提供程序模型创建数据层,在该模型中为每个将受支持的数据库系统创建一个库,并使用从配置文件中读取某些内容的代码来确定要加载的提供程序。

听起来您的情况的根本问题是数据层没有封装到单个库中,并且与任何其他层完全隔离。如果这是真的,那么松散的内聚和紧密的耦合就是你的问题的一些根源。

您应该考虑重构当前的库,以便所有数据库交互都在单个库中完成,并通过接口完全抽象出它上面的任何层。这可以通过多个发布周期逐步完成,直到最终所有调用都通过与数据库无关的接口或抽象类,其中您拥有为相关数据库加载适当具体类的工厂方法。

欲了解更多信息:

于 2010-06-11T05:14:49.907 回答