在 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(有时称为 CSDK .NET 提供程序)只与 GBase 8s 数据库服务器一起使用,并在内部使用 SQLI 协议与 GBase 8s 进行通信。GBase 8s .NET Provider 不再为新的 .NET API 而增强。
IBM Data Server .NET Provider(有时称为 Common .NET 提供程序)是用于应用程序开发的下一代 .NET 提供程序。此 .NET 提供程序包含若干功能(特别是在 Web 应用程序开发方面),使其成为新客户机开发领域的首选 .NET 提供程序。
GBase 8s .NET Provider 和 IBM Data Server .NET Provider 支持的功能部件之间有几个主要区别。IBM Data Server .NET Provider 支持的许多功能部件不受 GBase 8s .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 设计器,用于创建表、过程、函数和触发器,以及运行过程和函数 | 否 | 是 |
在 GBase 8s .NET Provider 中,Connection Lifetime 属性指定连接可以保持断开的时间。
在 IBM Data Server .NET Provider 中,Connection Lifetime 属性指定连接在池中保持断开和空闲的秒数。
在 GBase 8s .NET Provider 中,SERVER 关键字应当用于将 GBASEDBTSERVER 名称指定为 SetNet 实用程序中的设置。
在 IBM Data Server .NET Provider 中,SERVER 关键字应以格式 <hostname>:<port_number> 指定,其中 <hostname> 为实例的机器名称,而 <port_number> 为实例正在侦听的端口。
使用 GBase 8s .NET Provider,不指定数据库就可以连接到服务器。使用 IBM Data Server .NET Provider 时,database 为必需的属性。
GBase 8s .NET Provider 允许指定数据库属性的值,格式为 dbname@server。 IBM Data Server .NET Provider 不支持此格式。
GBase 8s .NET Provider 支持用引号括起的数据库、服务器和密码关键字值。
使用 IBM Data Server .NET Provider 的应用程序仅可以在指定目录连接别名的情况下,通过以引号括起的方式为数据库和密码关键字指定值。
对于此属性,GBase 8s .NET Provider 返回值 GBasedbt。 IBM Data Server .NET Provider 会返回从它所连接的数据库服务器接收到的值。例如,如果提供程序连接到安装在 UNIX 64 位系统上的 GBase 8t 数据库服务器,该提供程序可能会返回 IDS/UNIX64。
IBM Data Server .NET Provider 不允许访问 LIST、MULTISET、SET 或 ROW 数据类型,因为 GBase 8s DRDA 服务器不支持这些类型。
使用 GBase 8s .NET Provider,可以选择和返回 LIST、MULTISET 和 ROW 数据类型的值。
IBM Data Server .NET Provider 可以将 Byte 和 BLOB 两种数据类型映射到 IfxBlob 数据类型。将 IfxBlob 对象作为参数绑定时,应用程序必须在参数标记后使用 ::byte 子句。此子句表明 IfxBlob 值对应一个字节列。没有 ::byte 子句时,会返回转换错误。
DB2Parameter clobParam; clobParam.IfxType = IfxType.Clob; ... cmd.CommandText = "CALL textSP(?::text)"; --- cmd.ExecuteNonQuery();
下表对比了较不常见的 GBase 8s 数据类型,以及每个 .NET 提供程序对这些数据类型的支持情况。
| 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 提供程序对数据类型类和结构的支持差异。
| 类/结构 | 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。
Cmd.CommandText = "SELECT COUNT(*) FROM Tab";
Decimal count = (Decimal) Cmd.ExecuteScalar();
Int32 count = (Int32) Cmd.ExecuteScalar();
如果底层值为空,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]。 此外,相同类型错误的错误代码可能也不同。