考虑使用数据库功能

了解基本互操作性级别后,必须考虑应用程序使用的数据库功能。 例如,应用程序将执行哪些 SQL 语句? 应用程序是否会使用可滚动游标? 事务? 程序? 长日期? 如需了解所有 DBMS 可能不支持的功能,请参阅 SQLGetInfoSQLSetConnectAttrSQLSetStmtAttr 函数说明,以及附录 C:SQL 语法。 应用程序所需的功能可能会从目标 DBMS 列表中消除某些 DBMS。 这样可能还表明,应用程序可以轻松面向许多 DBMS。

例如,如果所需的功能很简单,通常可以通过高度的互操作性来实现这些功能。 执行简单的 SELECT 语句并通过只进游标检索结果的应用程序可能因其简单性而具有高度互操作性:几乎所有驱动程序和 DBMS 都支持其所需的功能。

但是,如果所需的功能更为复杂,例如可滚动游标、定位更新和删除语句以及程序,则通常必须做出权衡。 有几个可能的原因:

  • 互操作性较低,功能更多。 应用程序包含这些功能,但仅适用于支持这些功能的 DBMS。

  • 互操作性较高,功能更少。 应用程序会删除这些功能,但适用于更多 DBMS。

  • 互操作性较高,可选功能。 应用程序包含这些功能,但这些功能仅可供支持它们的 DBMS 使用。

  • 互操作性较高,功能更多。 应用程序将这些功能用于支持它们的 DBMS,并且为不支持它们的 DBMS 模拟这些功能。

前两种情况相对简单,因为这些功能要么用于所有支持的 DBMS,要么不用于任何 DBMS。 另一方面,后两种情况则更为复杂。 在这两种情况下,需要检查 DBMS 是否支持这些功能,而在最后一种情况下,需要编写大量代码来模拟这些功能。 因此,这些方案可能需要更长的开发时间,并且可能在运行时间速度较慢。

请考虑可连接到单个数据源的通用查询应用程序。 应用程序接受来自用户的查询,并在窗口中显示结果。 现在,假设此应用程序具有这样一项功能,即允许用户同时显示多个查询的结果。 也就是说,他们可以执行查询并查看部分结果,执行另一个查询并查看部分结果,然后返回到第一个查询。 这会带来互操作性问题,因为某些驱动程序仅支持单个活动语句。

应用程序有多种选择,具体取决于驱动程序在 SQLGetInfo 中为 SQL_MAX_CONCURRENT_ACTIVITIES 选项返回的内容:

  • 始终支持多个查询。 连接到驱动程序后,应用程序会检查活动语句的数量。 如果驱动程序仅支持一个活动语句,则应用程序将关闭连接,并通知用户该驱动程序不支持所需的功能。 该应用程序易于实现且具有完整的功能,但互操作性较低。

  • 从不支持多个查询。 应用程序完全删除了该功能。 该应用程序易于实现且互操作性较高,但功能更少。

  • 仅当驱动程序支持时,才支持多个查询。 连接到驱动程序后,应用程序会检查活动语句的数量。 仅当驱动程序支持多个活动语句时,应用程序才允许用户启动新语句。 该应用程序的功能更多且互操作性较高,但更能实现。

  • 始终支持多个查询,并在必要时模拟这些查询。 连接到驱动程序后,应用程序会检查活动语句的数量。 应用程序始终允许用户在某个语句处于活动状态时启动新语句。 如果驱动程序仅支持一个活动语句,则应用程序将打开与该驱动程序的其他连接,并在该连接上执行新语句。 该应用程序具有完整的功能且互操作性较高,但更难实现。