.NET 提供程序之间的差异

在 IBM® Data Server .NET Provider 和 GBase 8s .NET Provider 之间存在运行时差异。了解这些差异有助于理解每个提供程序如何影响现有应用程序,并选择适合您的应用程序的提供程序。

两种提供程序均可作为 GBase 8s 的 Client SDK (CSDK) 的一部分。

有关这些 .NET 提供程序的更多信息,请参阅 IBM Data Server Provider for .NET 程序员指南GBase 8s .NET Provider 参考指南

以下几节描述 .NET 提供程序之间的具体差异。

GBase 8s .NET Provider

GBase 8s .NET Provider(有时称为 CSDK .NET 提供程序)只与 GBase 8s 数据库服务器一起使用,并在内部使用 SQLI 协议与 GBase 8s 进行通信。GBase 8s .NET Provider 不再为新的 .NET API 而增强。

IBM Data Server .NET Provider

IBM Data Server .NET Provider(有时称为 Common .NET 提供程序)是用于应用程序开发的下一代 .NET 提供程序。此 .NET 提供程序包含若干功能(特别是在 Web 应用程序开发方面),使其成为新客户机开发领域的首选 .NET 提供程序。

Data Server .NET Provider 与几种不同的 IBM 数据服务器(包括 GBasedbt®、DB2® for Linux™, UNIX™, and Windows™ 以及 U2)一起使用,并使用 DRDA® 协议。此提供程序由两个不同的 .NET 提供程序组合件组成,这些组合件是针对非常具体的应用程序开发者需求而设计的:
IBM.Data.DB2.dll
尽管提供程序的名称中包含 DB2,实际上这是用于 IBM 数据服务器(包括 GBasedbt 和 DB2)的单个 .NET 提供程序。这是推荐的组合件,可用于 GBase 8t V8.5 的新应用程序开发,并且是首选 .NET 提供程序。
IBM.Data.GBasedbt.dll
创建此 .NET 提供程序组合件是为了帮助迁移使用 GBase 8s .NET Provider 开发的现有 .NET 应用程序以使用最新的 DRDA 协议。此组合件与 GBase 8s V8.5 一起使用。

受支持功能部件的比较

GBase 8s .NET Provider 和 IBM Data Server .NET Provider 支持的功能部件之间有几个主要区别。IBM Data Server .NET Provider 支持的许多功能部件不受 GBase 8s .NET Provider 支持。

下表显示了这些区别:

表 1. 比较 GBase 8s .NET Provider 和 IBM Data Server .NET Provider 支持的功能部件
功能部件 GBase 8s .NET Provider IBM Data Server .NET Provider
协议支持 SQLI DRDA
GBase 8s 服务器支持 GBase 8s V8.5 GBase 8s V8.5
LOB(BLOB 与 CLOB)列大小限制 4 TB 2 GB
支持 .NET Framework 3.0 和 3.5

支持 1.1 和 2.0 框架。有限 VSAI 窗口应用程序支持。

支持 2.0、3.0 和 3.5 框架。

对 LINQ(实体框架)的支持
Silverlight 和 AJAX 开发支持
提供 ASP.NET 动态数据支持
提供 ADO.NET 实体数据建模 (EDM) 支持
使用 EDM 进行的 Visual Studio Tools for Office (VSTO) 开发
对 Visual Studio 2008 的 VSAI 支持,Web 应用程序开发支持,WPF 和 WWF 增强功能
VSAI 设计器,用于创建表、过程、函数和触发器,以及运行过程和函数

ConnectionString 属性中不支持的关键字

有几种连接字符串关键字不受 IBM Data Server .NET Provider 支持。例如:
  • DB_LOCALE
  • CLIENT_LOCALE
  • EXCLUSIVE

连接池设置

在 GBase 8s .NET Provider 中,Connection Lifetime 属性指定连接可以保持断开的时间。

在 IBM Data Server .NET Provider 中,Connection Lifetime 属性指定连接在池中保持断开和空闲的秒数。

ConnectionString 属性中的服务器关键字

在 GBase 8s .NET Provider 中,SERVER 关键字应当用于将 GBASEDBTSERVER 名称指定为 SetNet 实用程序中的设置。

在 IBM Data Server .NET Provider 中,SERVER 关键字应以格式 <hostname>:<port_number> 指定,其中 <hostname> 为实例的机器名称,而 <port_number> 为实例正在侦听的端口。

ConnectionString 属性中的数据库关键字

使用 GBase 8s .NET Provider,不指定数据库就可以连接到服务器。使用 IBM Data Server .NET Provider 时,database 为必需的属性。

GBase 8s .NET Provider 允许指定数据库属性的值,格式为 dbname@server。 IBM Data Server .NET Provider 不支持此格式。

ConnectionString 属性中用引号括起的字符串值

GBase 8s .NET Provider 支持用引号括起的数据库、服务器和密码关键字值。

使用 IBM Data Server .NET Provider 的应用程序仅可以在指定目录连接别名的情况下,通过以引号括起的方式为数据库和密码关键字指定值。

IfxConnection.ServerType 属性

对于此属性,GBase 8s .NET Provider 返回值 GBasedbt。 IBM Data Server .NET Provider 会返回从它所连接的数据库服务器接收到的值。例如,如果提供程序连接到安装在 UNIX 64 位系统上的 GBase 8t 数据库服务器,该提供程序可能会返回 IDS/UNIX64

SQL 语句中不支持的数据类型

IBM Data Server .NET Provider 不允许访问 LIST、MULTISET、SET 或 ROW 数据类型,因为 GBase 8s DRDA 服务器不支持这些类型。

使用 GBase 8s .NET Provider,可以选择和返回 LIST、MULTISET 和 ROW 数据类型的值。

BYTE 和 TEXT 数据类型

IBM Data Server .NET Provider 可以将 Byte 和 BLOB 两种数据类型映射到 IfxBlob 数据类型。将 IfxBlob 对象作为参数绑定时,应用程序必须在参数标记后使用 ::byte 子句。此子句表明 IfxBlob 值对应一个字节列。没有 ::byte 子句时,会返回转换错误。

IBM Data Server .NET Provider 可以将 Text 和 CLOB 两种数据类型映射到 IfxClob 数据类型。将 IfxClob 对象作为参数绑定时,应用程序必须在参数标记后使用 ::text 子句。此子句表明 IfxClob 值对应一个文本列。没有 ::text 子句时,会返回转换错误。
DB2Parameter clobParam;

clobParam.IfxType = IfxType.Clob;
...
cmd.CommandText = "CALL textSP(?::text)";
---
cmd.ExecuteNonQuery();

支持的数据类型

下表对比了较不常见的 GBase 8s 数据类型,以及每个 .NET 提供程序对这些数据类型的支持情况。

表 2. .NET 提供程序对不常见 GBase 8s 数据类型的支持差异
GBase 8s 数据类型 GBase 8s .NET Provider IBM Data Server .NET Provider
CLOB 和 BLOB 支持 有限支持。大小限制为 2 GB。
Collection 支持 不支持
Interval DayToFraction 支持。此类型必须作为字符串读取。 不支持
IntervalMonth 支持 不支持
LIST 支持 不支持
MONEY 支持 Money 将被视为十进制数据类型。
MULTISET 支持 不支持
ROW 支持 不支持
SET 支持 不支持

对比类和结构

下表对比了 .NET 提供程序对数据类型类和结构的支持差异。

表 3. .NET 提供程序对数据类型类和结构的支持差异
类/结构 GBase 8s .NET Provider IBM Data Server .NET Provider
IfxBlob 支持 有限支持。某些方法返回 NotImplemented 异常。
IfxClob 支持 有限支持。某些方法返回 NotImplemented 异常。
IfxTimeSpan 支持 不支持
IfxMonthSpan 支持 不支持
IfxSmartLOBLocator 支持 不支持
IfxSmartLOB 支持 不支持
IfxDecimal 支持 有限支持。某些方法返回 NotImplemented 异常。
IfxDateTime 支持 有限支持。

DRDA 客户机支持 DateTime 的小数部分带 6 位数字。GBase 8s 服务器支持小数值带 5 位数字。由于此差异,最不重要的小数位将被截断。从 GBase 8t 服务器读取的 DateTime 值会在最不重要的小数位添加一个 0(零),以符合 DRDA 格式。此更改会影响从 GBase 8s .NET Provider 访问 IfxDateTime 类型的应用程序。

存储过程差异

使用 GBase 8s .NET Provider,应用程序可以 ReturnValue 参数的方式来读取存储过程或函数的返回值。

使用 IBM Data Server .NET Provider,应用程序在缺省情况下可以数据阅读器的方式来读取存储过程或函数的返回值。要将其作为 ReturnValue 参数读取,应用程序必须将 IfxCommand 或 IfxConnection 对象中的 ResultSetAsReturnValue 参数设置为 true。要将其作为 ReturnValue 参数读取,应用程序必须将 IfxCommand 或 IfxConnection 对象中的 ResultSetAsReturnValue 属性设置为 true。

IfxCommand.ExecuteScalar() 方法

以下查询为样本 SELECT 查询。
Cmd.CommandText = "SELECT COUNT(*) FROM Tab";
返回的数据类型取决于您所使用的 .NET 提供程序:
GBase 8s .NET Provider
使用 GBase 8s .NET Provider 时,此查询返回的计数为十进制类型。
Decimal count = (Decimal) Cmd.ExecuteScalar();
IBM Data Server .NET Provider
使用 IBM Data Server .NET Provider 时,此查询返回的计数为 Int32。
Int32 count = (Int32) Cmd.ExecuteScalar();

IfxDataReader.GetString() 方法

如果底层值为空,IBM Data Server .NET Provider 不允许使用 IfxDataReader.GetString() 方法。空值会引发 InvalidCast 异常。此行为与 GBase 8s .NET Provider 相反,GBase 8s .NET Provider 允许空值并会返回空字符串。

错误消息

IBM Data Server .NET Provider 接收到的某些错误消息与 GBase 8s .NET Provider 接收到的错误消息可能存在差异。例如,GBase 8s .NET Provider 的错误消息中有 [GBase 8s .NET provider] 这样的标记。而 IBM Data Server .NET Provider 的错误消息中只有 [IBM]。 此外,相同类型错误的错误代码可能也不同。