PDF文库 - 千万精品文档,你想要的都能搜到,下载即用。

KingbaseES客户端编程接口指南-ADO.NET.pdf

Hopeless(绝望)56 页 348.833 KB下载文档
KingbaseES客户端编程接口指南-ADO.NET.pdfKingbaseES客户端编程接口指南-ADO.NET.pdfKingbaseES客户端编程接口指南-ADO.NET.pdfKingbaseES客户端编程接口指南-ADO.NET.pdfKingbaseES客户端编程接口指南-ADO.NET.pdfKingbaseES客户端编程接口指南-ADO.NET.pdf
当前文档共56页 2.88
下载后继续阅读

KingbaseES客户端编程接口指南-ADO.NET.pdf

KingbaseES 客户端编程接口指南-ADO.NET 金仓数据库管理系统 KingbaseES 文档版本:V9(V009R001C001B0024) 发布日期:2023 年 10 月 12 日 北京人大金仓信息技术股份有限公司 目 目 录 录 第 1 章 前言 1 1.1 适用读者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 相关文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3 术语 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.4 手册约定 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第 2 章 概述 3 2.1 ADO.NET 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 KingbaseES .NET Data Provider 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.3 KingbaseES Entity Framework 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.3.1 Entity Framework 6 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.3.2 Entity Framework core 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.4 KingbaseES .NET Data Provider 基本框架 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.5 ADO.NET 驱动包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 第 3 章 KingbaseES 驱动在.NET 平台的配置 6 3.1 KingbaseES .NET Data Provider 的配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.2 KingbaseES Entity Framework 6 介绍与配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 KingbaseES Entity Framework 6 的配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 KingbaseES Entity Framework core 的配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.2.1 3.3 第 4 章 .NET Data Provider 驱动介绍与应用程序结构说明 4.1 4.2 9 .NET 驱动介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.1.1 KdbndpConnection 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.1.2 KdbndpCommand 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.1.3 KdbndpParameter 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4.1.4 KdbndpDataReader 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.1.5 KdbndpDataAdapter 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.1.6 KdbndpTransaction 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 .NET 应用程序结构说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 第 5 章 连接串参数 16 I 目 录 5.1 基础连接 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 5.2 安全与加密 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5.3 连接池 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5.4 超时和保活 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.5 性能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.6 杂项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.7 兼容性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 第 6 章 安全和加密 21 6.1 登录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 6.2 集成安全性(GSS/SSPI/Kerberos) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 6.3 加密(SSL/TLS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 第 7 章 Kdbnpg 支持的类型和类型映射 23 7.1 读取映射 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 7.2 写映射 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 第 8 章 事务 27 8.1 基本事务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 8.2 系统事务和分布式事务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 第 9 章 性能 28 9.1 预编译语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 9.2 禁用登记到 TransactionScope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 9.3 连接池重置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 9.4 读取大数值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 9.5 写入大数值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 9.6 Unix 域套接字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 第 10 章 预编译语句 30 10.1 介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 10.2 简单的预编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 10.3 持久性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 10.4 自动预编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 第 11 章 等待通知 33 11.1 KingbaseES 异步消息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 11.2 处理通知 33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第 12 章 保活机制 34 12.1 TCP 保活 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第 13 章 复制 34 35 13.1 二进制复制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 13.2 文本复制 36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . II 目 录 13.3 原始二进制复制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 13.4 Cancel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 第 14 章 示例 38 14.1 KdbndpConnection 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 14.2 KdbndpCommand 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 14.3 KdbndpParameter 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 14.4 KdbndpDataReader 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 14.5 KdbndpDataAdapter 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 14.6 KdbndpTransaction 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 14.7 EntityFramework6 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 版权声明 50 服务周期承诺 51 III 第 1 章 前言 1 第 章 前言 本文档描述了 ADO.NET 的基本信息,以及对应的 KingbaseES 提供的 ADO.NET 数据提供程序 KingbaseES .NET Data Provider。 前言部分包含以下主题: • 适用读者 • 相关文档 • 术语 • 手册约定 1.1 适用读者 KingbaseES ADO.NET 指南面向所有使用 KingbaseES 数据库的用户,主要是.NET Framework 应用程序开发人 员。 1.2 相关文档 有关 ADO.NET 的更多信息,请参阅以下资源: Work with data using ADO.NET 1.3 术语 无 1 第 1 章 前言 1.4 手册约定 本文档中可能出现“注意、提示、警告、另请参阅”等标志,它们所代表的含义如下: 注意: 用于突出重要/关键信息、最佳实践等。 提示: 用于突出小窍门、捷径等。 警告: 用于传递设备或环境安全警示信息,若不避免,可能会导致设备损坏、数据丢失、设备性能降低或其 它不可预知的结果。 另请参阅: 用于突出参考、参阅等。 以下程序代码书写约定适用于本文档: 符号 说明 [] 表示包含一个或多个可选项。不需要输入中括号本身。 {} 表示包含两个以上(含两个)的候选,必须在其中选取一个。不需要输入花括号本身。 | 分割中括号或者花括号中的两个或两个以上选项。不需要输入“|”本身。 ... 表示其之前的元素可以被重复。 斜体 表示占位符或者需要提供特定值的变量。 大写 表示系统提供的元素,以便与用户定义的元素相互区分。除出现在方括号中的元素外,应当按 照顺序逐字输入。当然,部分元素在系统中是大小写不敏感的,因此用户可以根据系统说明以 小写形式输入。 小写 表示由用户提供的元素。 2 第 2 章 概述 2 第 章 概述 • ADO.NET 概述 • KingbaseES .NET Data Provider 概述 • KingbaseES Entity Framework 概述 • KingbaseES .NET Data Provider 基本框架 • ADO.NET 驱动包 2.1 ADO.NET 概述 ADO.NET 是一组为.NET Framework 程序员提供的公开数据访问服务的类。它为创建分布式数据共享应用程 序提供了一组丰富的组件,可以对关系型数据、XML 和应用程序数据进行访问,是.NET Framework 中重要的一部 分。 2.2 KingbaseES .NET Data Provider 概述 KingbaseES .NET Data Provider 是 KingbaseES 提供的 ADO.NET 数据提供程序, 它允许用 C #,Visual Basic,F #编写的程序访问 KingbaseES 数据库服务器。它以 100%的 C #代码实现。 KingbaseES .NET Data Provider 的开发遵循.NET 平台的规范,它是.NET 平台应用程序与 KingbaseES 数据库 之间进行通信和数据交换的直接桥梁。 本手册的内容主要是描述.NET 平台如何通过 KingbaseES 提供的驱动库访问 KingbaseES ,简单介绍了 KingbaseES .NET Data Provider 的基本框架、主要的几个类的作用及使用方法。如果需要更为详细的说明,可参考 System.Data.SqlClient 的文档。KingbaseES 为.NET 提供的库文件名在.NET 平台下为 Kdbndp.dll。 3 第 2 章 概述 2.3 KingbaseES Entity Framework 概述 Entity Framework 是以 ADO.NET 为基础,面向数据的“实体框架”。针对不同的平台需求,有不同的“实体 框架”对应。 Entity Framework 包括跨平台 EFcore(Entity Framework Core)和 windows 平台 EF6(Entity Framework 6)。 • Entity Framework 6 概述 • Entity Framework core 概述 2.3.1 Entity Framework 6 概述 Entity Framework 6 是一种久经验证的数据访问技术。2008 年,它作为.NET Framework 3.5 SP1 和 Visual Studio 2008 SP1 的一部分首次发布。从 4.1 版本开始,EF6 作为 EntityFramework NuGet 包发布。EF6 在.NET Framework 4.x 上运行,这意味着它仅在 Windows 上运行。 2.3.2 Entity Framework core 概述 Entity Framework Core (EFcore) 是对在 2016 年首次发布的 EF6 的完全重写。它附带于 Nuget 包中,是 Microsoft.EntityFrameworkCore 的主要组成部分。EFcore 是一种跨平台产品,可以在.NET Core 或.NET Framework 上运行。EFcore 旨在提供类似于 EF6 的开发人员体验。 EFcore 支 持 多 个 数 据 库 引 擎, 包 括 KingbaseES, 为 了 支 持 EFcore,KingbaseES 提供了 Kdb- ndp.EntityFrameworkCore.KingbaseES。 2.4 KingbaseES .NET Data Provider 基本框架 一般的.NET 应用程序使用 ADO.NET 连接具体数据库时,需要经过 ODBC 或 OLEDB 等驱动程序才能访问具 体的数据源,KingbaseES .NET Data Provider 则直接提供完整的接口,使.NET 应用程序直接与 KingbaseES 数据 库服务器通信,从而减少了中间层的通信代价,提高了应用程序访问 KingbaseES 数据库的效率。 KingbaseES .NET Data Provider 数据提供程序实现了与 KingbaseES 连接的基类,包括 KdbndpConnection、 KdbndpCommand、KdbndpDataReader、KdbndpParameter、KdbndpTransaction。 KingbaseES .NET Data Provider 连接的这些基类构成连接对象,同时,支持 ADO.NET 中的非连接对象 DataSet。KingbaseES .NET Data Provider 使用.NET 平台的规范,提供 KdbndpDataAdapter 类用于与 DataSet 之间实现无缝对接。.NET 应用程序可以使用 KdbndpDataAdapter 对象向 DataSet 对象填充数据,也可以使用它向 数据库提交缓存在 DataSet 对象中的更改。 4 第 2 章 概述 2.5 ADO.NET 驱动包 KingbaseES 提供了以下几个驱动包来支持 ADO.NET: 驱动包 适用范围 v9_net20_kdbndp.zip .net framework 2.0 v9_net30_kdbndp.zip .net framework 3.0 v9_net35_kdbndp.zip .net framework 3.5 v9_net40_kdbndp.zip .net framework 4.0 v9_net45_kdbndp.zip .net framework 4.5<= 适用范围 <=4.8 v9_net50_kdbndp.zip .net5.0 <= 适用范围 < 6.0 v9_net60_kdbndp.zip .net6.0 <= 适用范围 <7.0 v9_net70.zip .net7.0 <= 适用范围 <8.0 v9_netcore2.0.zip .netcore2.0 <= 适用范围 <=netcore2.1 v9_netcore3.0.zip .netcore3.0 注意: v9_net50.zip、v9_net60.zip 和 v9_net70.zip 可跨框架使用,net core 和 net framework 都支持,所支持的版 本信息参见使用范围。目前安装包中携带的版本为 net40(net framework4.0)、net45(net framework4.5)net451(net framework4.5.0) 和 netstandard2.0(net core 2.0),如有其它版本需求,可至 人大金仓官网 进行下载。 5 第3章 3 第 章 KINGBASEES 驱动在.NET 平台的配置 KingbaseES 驱动在.NET 平台的配置 本节主要介绍在.NET 平台下如何配置 KingbaseES 提供的.NET 驱动,以及 KingbaseES 提供的 Entity Framework 6 驱动。 • KingbaseES .NET Data Provider 的配置 • KingbaseES Entity Framework 6 介绍与配置 • KingbaseES Entity Framework core 的配置 3.1 KingbaseES .NET Data Provider 的配置 KingbaseES .NET Data Provider 的命名空间为 Kdbndp 。 使用 Kdbndp 连接 KingbaseES 数据库的应用程序需要加入以下代码,以告诉编译程序正确调用相应命名空间。 • C# 中使用以下代码: using Kdbndp; • 依赖库: net45 驱动:.net core 框架中使用时,需要添加 System.Runtime.CompilerServices.Unsafe 依赖库,版本号为 4.5. 2; net40 驱动:使用时依赖 Mono.Security,该依赖会和驱动一起提供。 • 连接串的详细配置,请参考 KdbndpConnection 类的详细描述KdbndpConnection 示例 示例。 3.2 KingbaseES Entity Framework 6 介绍与配置 实体架构(Entity Framework)是微软以 ADO.Net 为基础开发出来的对象关系映射(ORM)解决方案,它解决 了对象持久化问题,将程序员从编写麻烦的 SQL 语句中解放出来。 6 第3章 KINGBASEES 驱动在.NET 平台的配置 关于 Entity Framework 使用的具体参数配置请参考EntityFramework6 示例 。 注意: .NET 应用需要增加对 Kdbndp 与 Kdbndp.EntityFramework.dll 的引用。 3.2.1 KingbaseES Entity Framework 6 的配置 KingbaseES Entity Framework 6 的命名空间为 Kdbndp,在 C# 程序中,需要在 config 文件中增加对 entityFramework 描述。 • config 中增加如下配置: • 依赖库: net45 驱动:在.net framework 框架中使用时依赖 EntityFramework 版本号 6.2.0 net40 驱动:使用时依赖 Mono.Security,该依赖会和驱动一起提供。 3.3 KingbaseES Entity Framework core 的配置 • 依赖库: .net core:Microsoft.NETCore.App -v 2.1.0 及以上版本 Microsoft.EntityFrameworkCore.Design 版本号 2.2.4 System.Runtime.CompilerServices.Unsafe 版本号 4.5.2 7 第3章 KINGBASEES 驱动在.NET 平台的配置 .net framework:Microsoft.EntityFrameworkCore.Tools 版本号 3.1.6。 8 第 4 章 .NET DATA PROVIDER 驱动介绍与应用程序结构说明 4 第 章 .NET Data Provider 驱动介绍与应用 程序结构说明 • .NET 驱动介绍 • .NET 应用程序结构说明 4.1 .NET 驱动介绍 本节介绍 KingbaseES 的.NET 驱动提供的几个基本功能类。 • KdbndpConnection 类 • KdbndpCommand 类 • KdbndpParameter 类 • KdbndpDataAdapter 类 • KdbndpTransaction 类 4.1.1 KdbndpConnection 类 KdbndpConnection 类用于与 KingbaseES 数据库服务器之间的连接,相当于 ADO Connection 类,它起到渠道 的作用。其他的类实体对象,比如 KdbndpDataAdapter 和 KdbndpCommand,通过 KdbndpConnection 与 KingbaseES 数据库服务器通信,以提交查询并获取查询结果。 KdbndpConnection 类使用连接字符串“ConnectionString”与 KingbaseES 数据库服务器建立连接。最简单的连 接形式参见KdbndpConnection 示例 。 ConnectionString 可以指定大量参数,以指定该连接与数据库连接时的行为。ConnectionString 中可以指定的选 项如下: • Server 或 Host 9 第 4 章 .NET DATA PROVIDER 驱动介绍与应用程序结构说明 KingbaseES 数据库服务器的地址,包括域名、主机名、主机的 IP 地址等,IP 地址支持 IPv4 与 IPv6。两个参数的意义相同,这两个参数必须指定一个。 • Port 与服务器连接的端口。默认为 54321。 • Protocol 指定与服务器连接使用的协议号。默认为 3。 • Database 指定要连接的数据库名。该参数必须指定。 • User Id 数据库用户名 • Password 与数据库用户名对应的密码。 • SSL 指定是否使用 SSL 连接。可取值为 True 和 False。默认为 False。 • Pooling 指定是否使用连接池。可取值为 True 和 False。默认为 True。 • MinPoolSize 连接池中最少连接数。默认为 1。 • MaxPoolSize 连接池中最大连接数,超过该数字则新建连接失败。默认为 20。 • Encoding 总是使用“UTF8”,并且忽略对该选项设置的新值。 • Timeout 连接等待的最大时间值,该时间内未连接成功则出错返回。单位为秒,默认为 15。 • CommandTimeout 命令执行的最大时间,超时则抛异常。单位为秒,默认为 20。 • SSLmode SSL 连接的模式,下列几种模式之一,默认为 Disable。 – Prefer:如果能用 SSL 建立连接,则使用 SSL 连接。 – Require:如果 SSL 不能建立连接,则抛异常返回。 – Allow:目前不支持,使用一般连接代替。 10 第 4 章 .NET DATA PROVIDER 驱动介绍与应用程序结构说明 – Disable:不使用 SSL 连接。 • ConnectionLifeTime 超出该时间,连接池中不再使用的连接会被取消。单位为秒,默认为 15。 • SyncNotification 指示驱动是否使用同步通知。可取值为 True 和 False。默认为 False。 • SearchPath 指定默认搜索位置。默认为 PUBLIC。 • Preload Reader 是否在执行 ExecuteReader 之前返回结果。可取值为 True 和 False。默认为 False。 该类还提供了其它一些与连接有关的方法。比如,支持事务操作(BeginTransaction())支持连接状态检 查(Conn.State),支持连接克隆(Clone() 方法),支持更换数据库(ChangeDatabase() 方法),支持 查询服务器版本信息(KingbaseESVersion() 方法)等。 4.1.2 KdbndpCommand 类 KdbndpCommand 类可以支持对 KingbaseES 数据库服务器的查询、对存储过程的调用、要求返回特定表内容的 直接请求。 KdbndpCommand 类支持多种不同类型的查询。使用 KdbndpCommand 类非常简单,先创建 KdbndpConnection 对象,再创建 KdbndpCommand 对象,并设置 KdbndpCommand 对象的 Connection 属性为 KdbndpConnection 对象,然后在 CommandText 属性中指定查询文本即可。 KdbndpCommand 类还提供表,视图,用户自定义函数和存储过程的确切名字,并使用 KdbndpCommand 类的 CommandType 属性设置需要执行的查询类型。 KdbndpCommand 类还提供了多种不同的 SQL 命令执行方式。主要分为以下几种: • ExecuteNonQuery() 方法 如果 KdbndpCommand 中的 SQL 命令不需要返回结果,则使用该方法执行这样的 SQL 命令。 • ExecuteScalar() 方法 执行查询,并返回查询返回的结果集中第一行的第一列。额外的列或行将被忽略。如果结果集为 空,则为返回空引用。 • ExecuteReader() 方法 KdbndpCommand 中的 SQL 命令返回多条记录,则需要调用该方法,用户可以使用 while() 之类的 循环逐条处理返回结果。通常情况下,可以将某一查询与内存中的 DataSet 类建立映射表,从而用 户可以批量处理或更新内存中的数据,最后再批量更新至数据库中,从而提高效率。但这种处理方 法有一个缺陷:取回数据后,应用程序就与数据库服务器断开连接,在将更新写回数据库前可能有 11 第 4 章 .NET DATA PROVIDER 驱动介绍与应用程序结构说明 其它应用程序更新了原始数据,即提高并发度的同时增加了数据库的潜在的不一致性。所以,通常 DataSet 应用于更新较少但处理的数据量较大的场合。 KdbndpCommand 类支持用户自定义函数和存储过程的调用,支持集合类型的返回值,支持 SQL 语句中 的用户自定义的参数,支持查询预处理。 4.1.3 KdbndpParameter 类 开发者在开发中,一般都倾向于使用参数化的查询,因为参数化的查询有助于简化编程,并生成更有效的代码。 使用参数化的 Command 对象,首先要为查询中的每一个参数创建一个 Parameter 对象,并设置合适的类型,赋予正 确的值,最后再加到 Command 对象的 Parameters 集合中。要使用那些通过输出参数 (out,inout) 返回数据的存储 过程和函数,可通过 ParameterDirection 枚举将 Parameter 对象的 Direction 属性设置为相应的值。 KdbndpParameter 类提供了丰富的构造函数,以便用户添加不同类型的参数。 当使用 KdbndpDbType 时,需要添加对 KdbndpTypes 命名空间的引用。 • public KdbndpParameter() • public KdbndpParameter(String , object ) • public KdbndpParameter(String , KdbndpDbType ) • public KdbndpParameter(String , DbType ) • public KdbndpParameter(String , KdbndpDbType , Int32 ) • public KdbndpParameter(String , DbType , Int32 ) • public KdbndpParameter(String , KdbndpDbType , Int32 , String ) • public KdbndpParameter(String , DbType , Int32 , String ) • public KdbndpParameter(String , KdbndpDbType , Int32 , String , ParameterDirection , bool , byte , byte , DataRowVersion , object ) • public KdbndpParameter(String , DbType , Int32 , String , ParameterDirection , bool , byte , byte , DataRowVersion , object ) KdbndpCommand 对象中 SQL 命令的参数以“:”和“@”KdbndpParameter 对象根据用户指定的数据类型, 对 SQL 命令中对应参数执行替换操作,并根据需要决定是否使用强制类型转换。 支持 returning into 语法,语法规则如下: returning [a,b,...] into [:param1, :param2,...]: 该语法支持 insert/update/delete 。 参数绑定操作在 KdbndpParameter 类中实现,创建 KdbndpParameter 时使用到的属性: a、Direction 参 数 类 型, 其值为 ParameterDirection.Input、ParameterDirection.Output、ParameterDirec- tion.InOutput 12 第 4 章 .NET DATA PROVIDER 驱动介绍与应用程序结构说明 b、ParamterName 参数名规则 a) 第一个字符必须是冒号 (”:”); b) 接下来的字符必须是下划线 (”_”), A-Z, a-z 或 0-9 的组合,但是冒号后的第一个字符不能是下划线; c) 字母必须全部来自英文字母表,并且只有冒号后的前 30 个字符是重要的。参数名是大小写不敏感的; d) 冒号后的占位符可以只由数字组成。如果只由数字组成,必须小于 65535。如果名称以数字开头,后续只允许 有数字; e) 不允许有短划线 (”-”)。 以下为 returning into 语法的使用用例: KdbndpCommand _cmd = new KdbndpCommand(); _cmd.Connection = conn; _cmd.CommandText = @"INSERT INTO returnning_test(id,name) VAlUES(:id,:name) returning id into :BIZIDx"; var p1 = _cmd.CreateParameter(); p1.ParameterName = ":id"; p1.Direction = System.Data.ParameterDirection.Input; p1.DbType = System.Data.DbType.Int32; p1.Value = 200; p1.Size = 400; _cmd.Parameters.Add(p1); var p2 = _cmd.CreateParameter(); p2.ParameterName = ":name"; p2.Direction = System.Data.ParameterDirection.Input; p2.DbType = System.Data.DbType.String; p2.Value = "abcabc"; p2.Size = 400; _cmd.Parameters.Add(p2); var p = _cmd.CreateParameter(); p.Direction = System.Data.ParameterDirection.Output; p.ParameterName = ":BIZIDx"; p.DbType = System.Data.DbType.Int32; p.Size = 20; _cmd.Parameters.Add(p); _cmd.ExecuteNonQuery(); 使用示例请参见KdbndpParameter 示例 。 13 第 4 章 .NET DATA PROVIDER 驱动介绍与应用程序结构说明 4.1.4 KdbndpDataReader 类 KdbndpDataReader 类用于以最快的速度检索并检查查询所返回的行。可使用 KdbndpDataReader 对象来检查 查询返回的结果,一次查询一行。当移向下一行时,前一行的内容就会丢弃。KdbndpDataReader 对象不支持更新操 作,因为它所返回的数据是只读的。由于 KdbndpDataReader 支持最小特性集,所以它的速度非常快,而且是轻量 级的。 KdbndpDataReader 的使用参见KdbndpDataReader 示例 。 4.1.5 KdbndpDataAdapter 类 KingbaseES .NET Data Provider 提供了与 KingbaseES 数据库服务器进行连接的类库,System.Data 命名空间 中的 DataSet 类则提供了非连接查询的属性和操作集合。 KdbndpDataAdapter 类提供了 KingbaseES .NET Data Provider 类库与 DataSet 类之间进行交互的功能。KdbndpDataAdapter 对象充当 KingbaseES 数据库服务器与 ADO.NET 对象模型中的非连接对象 DataSet 对象之间的桥 梁。 KdbndpDataAdapter 对象的 fill() 方法提供了将查询结果导入 DataSet 或 DataTable 的有效机制,从而使得应 用程序可以脱机处理数据。同时,应用程序还可以通过 KdbndpDataAdapter 对象向 KingbaseES 数据库服务器提交 存储在 DataSet 对象中的更改。 KdbndpDataAdapter 对象的 SelectCommand 属性实际上表明了要从数据库中导入到 DataSet 中的数据行,即 SelectCommand 中”select SQL” 命令执行返回的结果。 KdbndpDataAdapter 对象包括 UpdateCommand,InsertCommand 和 DeleteCommand 属性,分别与应用程序 用来向 KingbaseES 数据库服务器提交修改的数据行,新建数据行和删除数据行的 KdbndpCommand 对象相对应。 KdbndpDataAdapter 对象会填充 DataSet 对象中的表,而且也能读取缓存在 DataSet 中的更改,并提交给数据 库。KdbndpDataAdapter 有一些支持属性可跟踪在什么位置发生了什么操作。 KdbndpDataAdapter 的使用参见KdbndpDataAdapter 示例 。 4.1.6 KdbndpTransaction 类 KdbndpTransaction 对象可以将一系列的 SQL 操作定义为一个事务,从而保证该事务内部的所有操作要么都成 功执行,要么都不执行,保证数据的一致性和原子性。 KdbndpTransaction 用来创建 Transaction 对象。该对象可用来在 Transaction 对象的生存期提交或取消对数据 库所做的更改。 KdbndpTransaction 的使用参见KdbndpTransaction 示例 。 14 第 4 章 .NET DATA PROVIDER 驱动介绍与应用程序结构说明 4.2 .NET 应用程序结构说明 使用 KingbaseES .NET Data Provider 连接 KingbaseES 数据库的应用程序,一般可分为以下几个部分: • KdbndpConnection.Open() • KdbndpCommand 或 KdbndpCommandBuilder • KdbndpParameter • KdbndpCommand.Execute(xxx)([xxx]) • KdbndpDataReader 或 KdbndpDataAdapter • KdbndpConnection.Close 具体说明如下: a. 创建一个与 KingbaseES 数据库进行连接的 KdbndpConnection 对象,可以根据需要通过设置不同的 ConnectionString 来设置连接类型。连接参数信息具体参考KdbndpConnection 示例 。 b. 打开刚建立的连接。 c. 创建一个 KdbndpCommand 对象,设置其 Connection 属性为刚建立的连接。 d. KdbndpCommand 对象的 CommandText 属性可以指定各种用户查询。如果要在 KdbndpCommand 对象中指 定参数,则需要在 CommandText 中标记参数,并为每个参数新建一个 Parameter 对象,同时指定 Parameter 对象的各种属性。 e. SQL 命令的执行按其命令的不同形式,及用户期望的返回结果,可以调用不同的命令执行方式。 • 对于返回值为结果集类型的,可创建一个 KdbndpDataReader 对象进行逐行读取。 • 对于希望对数据进行脱机处理的,可创建一个 KdbndpDataAdapter 对象进行 KdbndpConnection 连接对 象与 DataSet 之间的通信。 f. 处理完所有操作后需要关闭与 KingbaseES 数据库服务器的连接。 15 第 5 章 连接串参数 5 第 章 连接串参数 连接数据库时,应用程序通过了一个连接字符串。这个字符串中指定了主机、用户名、密码等参数。连接字符串 的格式为 key=value,且不区分大小写。包含特殊字符的值可以用双引号引起来。关于更多信息,请参阅 Connection Strings in ADO.NET 。 下面是 Kbdndp 提供的连接字符串参数,以及一些标准的 PostgreSQL 环境变量。 • 基础连接 • 安全与加密 • 连接池 • 超时和保活 • 性能 • 杂项 • 兼容性 5.1 基础连接 参数 描述 默认 host 数据库服务器的地址,包括域名、主机名、主机的 IP 地址 必选 等,则将其用作 Unix 域套接字的目录(仍然需要指定一个端 口)。 port KingbaseES 服务器的 TCP 端口。 54321 database 要连接的 KingbaseES 数据库。 必须自己指定 username 要连接的用户名。如果使用 IntegratedSecurity, 则不需要。 用户名 见续表 16 第 5 章 连接串参数 表 5.1.1 – 续表 参数 描述 默认 password 要连接的用户的密码。如果使用 IntegratedSecurity, 则不需 密码 要。 KingbaseES 密码文件的路径,从中获取密码 passfile 5.2 KESPASSFILE 文件 安全与加密 参数 描述 SSL Mode 根据服务器支持情况来控制是否使用 为’Require’、’Disable’ 默认 SSL。 可 以 设 置 Disable 或 者’Prefer’。 更 多 信 息 请 参 考‘安 全和加密 ‘_ 。 Trust Server Certificate 是否信任服务器证书而不验证它。更多信息请参考‘安全和加 False 密 ‘_ 。 Use SLL Stream Kdbndp 使用自己的内部 TLS/SSL 实现。打开这个设置则换 False 成使用.NET SslStream Check Certificate Revocation 认证时是否检查证书吊销列表。 False Integrated Security 是否使用集成安全登录(GSS/ SSPI)。更多信息请参考‘安全 False 和加密 ‘_ 。 Persist Security Info 获取或设置一个 Boolean 值,该值指示在连接打开或已经处于 False 打开状态时,是否不将安全敏感信息(如密码)作为连接的一 部分返回。 Kerberos Service Name 用于身份验证的 Kerberos 服务名称。更多信息请参考‘安全和 kingbase 加密 ‘_ 。 Include Realm 用于身份验证的 Kerberos 领域。更多信息请参考‘安全和加密 ‘_ 。 5.3 连接池 17 第 5 章 连接串参数 参数 描述 默认 Pooling 是否使用连接池。 true Minimum Pool Size 连接池最小连接数。 1 Maximum Pool Size 连接池最大连接数。 100 Connection Idle Lifetime 当连接总数超过 MinPoolSize 时,关闭池中的空闲连接 300 需要等待的时间(以秒为单位)。 Connection Pruning Interval 在尝试删除超过空闲生命周期的空闲连接之前,连接池 10 需要等待多少秒。 5.4 超时和保活 参数 描述 默认 Timeout 在终止尝试并生成错误之前,尝试建立连接的等待时间(以秒 15 为单位)。 Command Timeout 在终止尝试并生成错误之前,尝试执行命令时的等待时间(以 20 秒为单位)。设置为 0 表示无穷大。 Internal Command Timeout 在终止尝试并生成错误之前,尝试执行内部命令时的等待时间 -1 (以秒为单位)。设置为-1 表示使用 CommandTimeout,0 表示没有超时限制。 Keepalive Kdbndp 发送 keepalive 查询之前连接不活跃的秒数。 disabled TCP Keepalive 如果为指定覆盖,是否将 TCP keepalive 设置为与系统默认值 disabled 相同。 TCP Keepalive Time 在发送 TCP keepalive 查询之前,连接不活跃的毫秒数。不推 disabled 荐使用此项,可以使用 Keepalive 代替。仅在 Windows 上支 持。 TCP Keepalive Interval 如果没有收到确认,则发送连续保持活动数据包之间的时间间 与 隔(以毫秒为单位)。TCP Keepalive Time 也必须非 0。仅在 Keepalive Windows 上支持。 Time TCP 的 值保持一 致。 18 第 5 章 连接串参数 5.5 性能 参数 描述 默认 Max Auto Prepare 在任何给定点可以自动准备的最大 SQL 语句数。超过这个 0 值,将回收最近使用最少的语句。设置为 0 将禁用自动准备。 Auto Prepare Min Usages SQL 语句在自动准备之前使用的最少次数。 5 Use Perf Counters 使 Kdbndp 将有关连接使用的性能信息写入 Windows 性能计 false 数器。 Read Buffer Size 确定 Kdbndp 在读取时使用的内部缓冲区的大小。如果从数据 8192 库传输大值,增大这个参数值可以提高性能。 Write Buffer Size 确定 Kdbndp 在写入时使用的内部缓冲区大小。如果将大值传 8192 输到数据库,增大这个参数值可以提高性能。 Scoket Receive Buffer Size 确定套接字接收缓冲区的大小。 Systemdependent Socket Send Buffer Size 确定套接字发送缓冲区的大小。 Systemdependent No Reset On Close 在某些情况下,通过在连接状态返回池中时不重置连接状态来 false 提高性能,但可能泄露状态。仅在基准测试显示性能改进时使 用。 5.6 杂项 参数 描述 Application Name 在连接启动期间要发送到后端的可选应用程序名称参数。 Enlist 是否加入 TransactionScope 环境。 Search Path 设置架构搜索路径。 Client Encoding 获取或设置 client-encoding 参数。 Timezone 获取或设置会话时区。 默认 true 见续表 19 第 5 章 连接串参数 表 5.6.1 – 续表 5.7 参数 描述 默认 EF Template Database 在 Entity Framework 中创建数据库时指定的数据库模板。 template1 Load Table Composites 加载表复合类型定义,而不仅仅是独立的复合类型。 false 兼容性 参数 描述 默认 Server Compatibility Mode 特殊 KingbaseES 服务器类型的兼容模式。目前支持” Red- none shift” 以及”NoTypeLoading”, 它将绕过 KingbaseES 目录表中 的正常类型加载机制,并支持基本数据类型的硬编码列表。 Convert Infinity DataTime 使 MaxValue 和 MinValue 的时间戳和日期可读为无穷大和负 false 无穷大。 20 第 6 章 安全和加密 6 第 章 安全和加密 • 登录 • 集成安全性(GSS/SSPI/Kerberos) • 加密(SSL/TLS) 6.1 登录 登录 KingbaseES 的最简单方法是在连接字符串中指定 Username 和 Password 。Password 根据 KingbaseES 的 配置方式(在 .conf 文件中),Kdbndp 将以 MD5 或明文形式发送密码(不推荐)。 如果未指定 Password 且 KingbaseES 配置为请求密码(普通或 MD5),Kdbndp 将查找标准 KingbaseES 密码 文件。如果您指定 Passfile 连接字符串参数,将使用它指定的文件。如果未定义该参数,Kdbndp 将在从 KESPASSFILE 环境变量获取的路径下查找。如果未定义环境变量,Kdbndp 将回退到与系统相关的默认目录。 KdbndpConnection 也可以配置一个 ProvidePasswordCallback 。这将在打开新的数据库连接以在代码中生成密 码时执行。可以将其配置为使用基于访问凭证生成的短期令牌。未指定 ProvidePasswordCallback 密码和 Passfile 连 接字符串参数时执行委托。 6.2 集成安全性(GSS/SSPI/Kerberos) 不建议使用以用户名和密码登录的方式,因为这样应用程序必须访问您的密码。另一种身份验证的方式是“集成 安全”,它使用 GSS 或 SSPI 来通过 Kerberos 验证。这种方法的优点是,使用已经打开的登录会话,将身份验证传 递给操作系统,应用程序永远不需要处理密码。您可以将此方法用于 Kerberos 登录、Windows Active Directory 或 本地 Windows 会话。 关于设置 Kerberos 和 SSPI 的说明可以参考 PostgreSQL auth methods docs 。 一旦正确配置 KingbaseES,只需在连接字符串中指定 Intefrated Sercurity=true 并且删除密码参数,但是 Kdbndp 仍然需要向 KingbaseES 发送用户名。如果在连接字符串中指定了 Username 参数,Kdbndp 会正常发送。如果 省略了该参数,Kdbndp 将尝试检测系统用户名,包括 Kerberos 域。 21 第 6 章 安全和加密 默认情况下,KingbaseES 期望您的 Kerberos 域以您的用户名发送;您可以通过在连接字符串中设置 Include Realm 为 true 来让 Kdbndp 检测区域,或者,您可以在 KingbaseES 的 kdb.conf 配置中设置 include_realm=0 来将 其剥离域,这样就可以自己指定发送到 KingbaseES 的用户名。 6.3 加密(SSL/TLS) 默认情况下 KingbaseES 连接是未加密的,您可以根据需要打开 SSL/TLS 加密。 1. 首先,需要设置 KingbaseES 以接收 SSL/TLS 连接。 2. 完成后,在连接字符串中指定”SSL Mode”,将其设置为 Require (如果服务器没有设置加密,连接将失败),或 者 Prefer (如果服务器设置了加密,则使用加密,否则会回退到未加密状态)。 默认情况下,Kdbndp 将验证您的服务器的证书是否有效。如果您使用的是自签名证书,验证将会失败。您可以 通过在连接字符串中指定 Trust Server Certificate=true 来指示 Kdbndp 忽略验证。为了精确的控制服务器的证书是 如何验证的,您可以在 KdbndpConnection 上注册 UserCertificateValidationCallback (和在.NET 上的 SSLStream 一 样)。 您还可以通过在 KdbndpConnection 上注册 ProvideClientCertificatesCallback 来让 Kdbndp 向服务器提供客户 端证书。 22 第 7 章 KDBNPG 支持的类型和类型映射 7 第 章 Kdbnpg 支持的类型和类型映射 下面列出了将 CLR 类型读取和写入 KingbaseES 类型时的内置映射。 • 读取映射 • 写映射 7.1 读取映射 下面显示了读取值时使用的映射 • 使用和类似方式:KdbnpgCommand.ExecuteScalar(),将返回默认类型 KdbnpgDataReader.GetValue(); • 可以通过调用读取为其它类型:KdbnpgDataReader.GetFieldValue(); • 提供程序特定的类型并返回:KdbnpgDataReader.GetProviderSpecificvalValue()。 表 7.1.1: 读取数据时 KingbaseES 数据类型和.NET 类型之间映射 KingbaseES 数据类型 默认.NET 类型 提供者特定的类型 其它.NET 类型 boolean bool smallint int byte,sbyte,int,long,float,double,decimal bigint long byte,short,long,float,double,decimal integer int byte,short,long,float,double,decimal real float double double precision numeric decimal double byte,short,int,long,float,double 见续表 23 第 7 章 KDBNPG 支持的类型和类型映射 表 7.1.1 – 续表 KingbaseES 数据类型 默认.NET 类型 提供者特定的类型 其它.NET 类型 money decimal text string char[] character varying string char[] character string char[] citext string char[] json string char[] jsonb string char[] xml string char[] oid uint xid uint cid uint byte byte[] bit(1) bool bit(n) BitArray bit varying BitArray uuid Guid date DataTime KdbnpgData interval TimeSpan KdbnpgDataSpan timestamp without time zone DataTime(Unspecified) KdbnpgDataTime timestamp with time zone DataTime(Local) KdbnpgDataTime time without time zone TimeSpan time with time zone DataTimeOffset DataTimeOffset,DataTime,TimeSpan name string char[] record object[] BitArray DateTimeOffset 24 第 7 章 KDBNPG 支持的类型和类型映射 7.2 写映射 有以下三个规则确定为参数发送 KingbaseES 类型: • 如果参数设置了 KdbnpgDbType, 则使用它; • 如果参数设置了 DataType, 则使用它; • 如果参数设置了 DbType,则使用它; • 如果未设置上述任何一项,则将从 CLR 值类型推断后端类型。 表 7.2.1: 写数据时 KingbaseES 数据类型和.NET 类型之间映射 KdbnpgDbType DbType KingbaseES 类型 可接受的.NET 类型 Boolean Boolean boolean bool smallint Int16 smallint short Integer Int32 integer int Bigint Int64 bigint long Real Single real float Double Double double precision double Numeric Decimal,VarNumeric numeric decimal Money Currency money decimal Text String,StringFixedLength,text AnsiString, string,char[],char An- siStringFixedLength Varchar character varying text string,char[],char Char character varying string,char[],char Citext citext string,char[],char Json json string,char[],char Jsonb jsonb string,char[],char Xml xml string,char[],char Bit bit BitArray,bool,string 见续表 25 第 7 章 KDBNPG 支持的类型和类型映射 表 7.2.1 – 续表 KdbnpgDbType DbType Varbit bit varying KingbaseES 类型 可接受的.NET 类型 BitArray,bool,string Hstore hstore IDictionary Uuid uuid Guid date DateTime,KdbnpgDate interval TimeSpan,KdbnpgTimeSpan Date Date Interval Timestamp DateTime,DateTime2 timestamp without DateTime,KdbnpgDataTime time zone TimestampTz DateTimeOffset timestamp with time DateTimeOffset,DateTime,TimeSpan zone Time Time time without time zone TimeSpan time with time zone DateTimeOffset,DateTime,TimeSpan bytea byte[],ArraySegment Oid oid uint Xid oid uint Cid cid uint Oidvector oidvector uint[] Name name string,char[],char InternalChar (internal)char byte Composite composite types T Range | (other Kdb- range types KdbnpgRange Enum enum types TEnum Array | (other Kdb- arrays types Array,IList,IList TimeTz Bytea Binary npgDbType) npgDbType) 26 第 8 章 事务 8 第 章 事务 • 基本事务 • 系统事务和分布式事务 8.1 基本事务 事务可以通过调用标准的 ADO.NET 方法 KdbndpConnection.BeginTransaction() 来启动。 KingbaseES 不支持嵌套事务或并发事务,在任何时刻,进程中只能有一个事务。当已有一个事务在进行时调用 BeginTransaction() 将会抛出异常。因此,没有必要将从 BeginTransaction() 返回的 KdbndpTransaction 对象传递给 执行的命令。调用 BeginTransaction() 意味着所有的后续命令都会自动参与到事务中,直至执行了提交或回滚。为了 获得最大的可移植性,建议在命令中设置事务。 虽然不支持并发事务,但 KingbaseES 支持“保存点”的概念。你可以再一个事务中设置命名保存点,然后回 滚它们,而不回滚整个事务。可以分别通过 KdbndpStransaction.Save(name) 、KdbndpStransaction.RollBack(name) 、KdbndpStransaction.Release(name) 来创建、回滚、释放保存点。 当调用 BeginTransactiom() 时,您可以选择设置隔离级别。 8.2 系统事务和分布式事务 除了 KdbndpConnection.BeginTransaction() ,.net 还包括 System.Transactions , 这是一个用于管理事务的替代 API(详细信息请参见 Implementing an Implicit Transaction using Transaction Scope )。 当多个连接(或资源)登记在同一个事务中时,该事务被称为分布式事务。分布式事务允许您通过两阶段提交协 议跨多个数据库原子地执行更改(详细信息请参见 Distributed Transactions Overview )。Kdbndp 支持分布式事 务。Kdbndp 登记为一个“易失性资源管理器”,因此如果应用程序在执行时崩溃,将无法正确执行恢复。您可以浏 览 Enlisting Resources as Participants in a Transaction 来了解更多。 注意,如果你在环境事务中打开和关闭与同一个数据库的连接,而没有同时打开两个连接,Kdbndp 将在内部重 新启动同一个连接,避免升级到完全的分布式事务。这对性能和简单性都更有效。 27 第 9 章 性能 9 第 章 性能 • 预处理语句 _ • 禁用登记到 TransactionScope • 连接池重置 • 读取大数值 • 写入大数值 • Unix 域套接字 9.1 预编译语句 提高应用程序性能的最重要(也是最简单)的方法之一就是使用预编译语句,即使您不是直接针对 ADO.NET 进 行编码,Kdbndp 也有一个自动编译功能,它允许您从以预编译语句来提升的性能中获益。 9.2 禁用登记到 TransactionScope 默认情况下,当在 TransactionScope 中打开连接时,Kdbndp 将登记到环境事务,它可以为处理事务提供一个强 大的编程模型。但是,这需要到在每次打开(池)连接时检查环境事务是否正在进行,这个操作花费的时间比您想象 的多。在连接时间很短、打开/关闭频繁发生的场景中,只需在连接字符串中指定 Enlist=false,就可以避免该检查来 提升性能。当然,禁用登记后您仍然可以通过调用 KdbndpConnection.Enlist() 来手动登记。 9.3 连接池重置 当一个池连接被关闭时,Kdbndp 将在下一次使用它时重置它的状态。这可以防止物理连接的一个使用周期向另 一个使用周期泄露状态。例如,当你改变了某些 KingbaseES 参数(例如 ‘statement_timeout‘),当连接关闭时,这 些参数的改变并不存在。 28 第 9 章 性能 连接重置通过 KingbaseES 的 DISCARD ALL 命令进行,或者,如果在关闭时有任何预处理语句,则通过文档中描 述的等价语句的组合进行(以防止关闭这些语句)。请注意,这些语句在关闭连接时并没有发送————它们被写入 Kdbndp 的内部写缓冲区,并将在连接重新打开后与第一个用户语句一起发送。这可以节省数据库的往返消耗。 如果你想利用 KingbaseES 的每一点性能,你可以通过在连接字符串上指定 No reset On Close 来禁用连接重置 ————这将在连接时长非常短暂的场景中略微提高性能,特别是在使用预处理语句的情况下。 9.4 读取大数值 当从 KingbaseES 读取结果时,Kdbndp 首先从网络读取原始的二进制数据读取到内部的读取缓冲区,然后在调 用 KdbndpDataReader.GetString() 等方法时解析这些数据。读取缓冲区大小默认为 8K。正常使用情况下,Kdbndo 尝试将每一行读入缓冲区,如果一行刚好读满 8K,则获得最佳性能。然而,如果一行大于 8K,Kdbndp 将分配一个 超大缓冲区,直到连接关闭或返回池。这种情况可能会造成严重的内存混乱,进而降低应用程序的效率。为了避免这 种情况发生,如果您知道将要读取 16K 大小的行,您可以在连接字符串中指定 Read Buffer Size=18000 (为协议开销 留出一些缓冲),这样就可以确保读取缓冲区可以重用,并且不会发生额外的分配。 另一个选项是将 CommandBehavior.SequentialAccess 传递给 KdbndpCommand.ExecuteReader() 。Sequential 模式意味着 Kdbndp 不再将整行读取到它的缓冲区,而是根据需要填充缓冲区,只在缓冲区为空时读取更多的数据。 无论行的总大小如何,都将使用相同的 8K 的读缓冲区,Kdbndp 将负责细节处理。但是,在 Sequential 模式中,必 须按照指定的顺序读取行字段,不能读取第二个字段后,再去读取第一个字段,尝试这样做将会产生异常。同样的, 也不能两次读取同一个字段。 另外,也可以通过设置连接字符串中的 Socket Receive Buffer Size 参数来控制 socket 的接收缓冲区大小(不同 于 Kdbndp 的内部缓冲区)。 9.5 写入大数值 写入与读取类似————Kdbndp 有一个内部写入缓冲区(默认也是 8K)。当向 KingbaseES 写入查询的 SQL 和参数时,Kdbndp 会顺序写入,填满 8K 缓冲区并在填满时刷新。你可以使用 Write Buffer Size 来控制缓冲区的大 小。 你也可以通过设置 Socket Send Buffer Size 连接字符串参数来控制 socket 的发送缓冲区大小(不同于 Kdbndp 的 内部缓冲区)。 9.6 Unix 域套接字 如果您在 Linux 或 macOS 上连接到同一台机器上的 KingbaseES 服务器,可以通过 Unix 域套接字(而不是常 规的 TCP/IP)连接来稍微提高性能。只需要在连接字符串的 Host 参数中指定 KingbaseES 套接字的目录。如果该 参数以“/”开头,它将被视为文件系统路径。 29 第 10 章 预编译语句 10章 预编译语句 第 • 介绍 • 简单的预编译 • 持久性 • 自动预编译 10.1 介绍 大多数应用程序都在多次重复使用相同的 SQL 语句,传递不同的参数,在这种情况下,预编译语句将起到很好 的作用。将命令语句发送到 KingbaseES,KingbaseES 将它们解析和规划。然后可以在执行时使用预编译好的语句, 从而节省时间。查询语句越复杂,性能提升越明显。 预编译语句唯一的缺点是它们占有服务器端资源,例如缓存计划。如果要动态生成 SQL 查询,请确保服务器不 会因预编译过多而超负荷。大多数合理的应用程序不必担心这一点。 10.2 简单的预编译 要预编译您的命令,只需使用以下标准的 ADO.NET 代码: var cmd = new KdbndpCommand(...); cmd.Parameters.Add("param", KdbndpDbType.Integer); cmd.Prepare(); cmd.ExecuteNonQuery(); 请注意,所有参数都必须在调用 Prepare() 之前设置, 它们是传递到 KingbaseES 的信息的一部分,用于有效的 规划语句。您还必须在参数上设置 DbType 或 KdbndpDbType 以明确指定数据类型,但不支持设置值。 30 第 10 章 预编译语句 预编译发生在单个语句上,而不是命令上,命令可以包含多个语句,将它们一起批处理。这在以下情况中很重 要: var cmd = new KdbndpCommand("UPDATE foo SET bar=@bar where baz=@baz; UPDATE foo SET bar=@bar where baz=@baz"); cmd.Prepare(); 虽然该命令中有两条语句,但由于 SQL 是相同的,所以使用相同的预编译语句来执行。 10.3 持久性 KingbaseES 支持预编译好的语句持久性,当命令或链接关闭时,它们不会被关闭。Kdbndp 跟踪在每个物理连 接上预编译的语句;如果您在同一连接上第二次预编译相同的 SQL,Kdbndp 将简单地重用第一次预编译中编译好 的语句。这意味着在拥有短期池连接的应用程序中,预编译语句将随着应用程序的准备和连接的首次使用而被逐渐创 建。当打开一个新的池连接时将返回一个物理连接,该链接已经为您的 SQL 准备好了语句,从而显著提升了性能。 例如: using(var conn = new KdbndpConnection(...)) using(var cmd = new KdbndpCommand("",conn)){ conn.Open(); cmd.Prepare(); cmd.ExecuteNonQuery(); } 您仍然可以选择通过调用 KdbndpCOmmand.Unprepare() 来 关 闭 预 编 译 语 句, 也 可 以 通 过 调 用 KdbndpConnection.UnprepareAll() 来取消给定连接上的所有语句的预编译。 10.4 自动预编译 本章节已提供的预编译示例依赖于调用 Prepare() 命令,使性能有了显著的提升。然而,如果您在 ADO.NET 上使用某些数据层,例如 Dapper 或 Entity Framework,这些数据层很可能无法为您提供预编译。它们目前还没有利 用好预编译语句的优点。 Kdbndp 引入了自动预编译。打开自动预编译后,Kdbndp 将跟踪您执行的语句,并在达到某个阈值时自动预编 译它们。达到这个阈值时,语句会自动预编译好,并且从此时起将按照预编译的的方式执行,从而利用本章节描述的 所有性能优势。 要开启此功能,您只需设置 Max Auto Prepare 连接字符串参数,该参数决定了在任何给定时间可以在连接上自 动预编译多少条语句(此参数默认为 0,表示禁用该功能)。第二个参数 Auto Prepare Min Usages 确定在自动预编 译前需要执行多少次语句(默认为 5 次)。由于不需要更改代码,您可以简单的尝试设置 Max Auto Prepare 并运行 31 第 10 章 预编译语句 程序,可以直观地看到速度的提升。另外,与显式预编译的语句一样,自动预编译的语句是持久的,使得在短期连接 应用程序中获得性能优势。 请注意,如果您直接针对 Kdbndp 或 ADO.NET 进行编码,仍然建议使用 Prepare 显式预编译命令,而非自动 预编译。由于存在内部 LRU 缓存和各种记账数据结构,与显式预编译相比,自动预编译会产生轻微的性能成本。显 式预编译还允许您更好的准确控制哪些语句已预编译好,哪些未预编译好,并确保您的语句始终保持预编译状态,并 且永远不会因为 LRU 机制而被弹出。 自动预编译是一个复杂的新功能,如果您发现有任何奇怪的反应或问题,请尝试将其关闭。 32 第 11 章 等待通知 11章 等待通知 第 • KingbaseES 异步消息 • 处理通知 11.1 KingbaseES 异步消息 KingbaseES 有一个特性,可以在客户端之间发送任意通知消息。例如,一个客户端可能会一直等待,直到另一 个客户端通知它应该执行的任务。通知本质上是异步的,它们可以在任何时候到达。 11.2 处理通知 Kdbndp 通过 KdbndpConnection 上的 Notification 事件公开通知消息。 由于很少使用异步通知并且处理过程可能很复杂,因此 Kdbndp 仅将通知消息作为常规(同步)查询交互的一部 分进行处理。也就是说,如果发送了异步通知,Kdbndp 只会在下一次发送和处理命令时处理它并向用户发出事件。 要在同步请求-响应周期之外接收通知,请调用 KdbndpConnection.wait()。这将使您的线程阻塞,直到接收到 单个通知(请注意,存在超时版本和异步版本)。请注意,通知仍然像以前一样通过 Notification 事件传递。 var conn = new KdbndpConnection(ConnectionString); conn.open(); conn.Notification += (o, e) => Console.WriteLine("Recieved notification"); using(var cmd = new KdbndpCommand("LISTEN channel_name", conn)){ cmd.ExecuteNonQuery(); } while(true){ conn.Wait(); } 33 第 12 章 保活机制 12章 保活机制 第 一些客户端会长时间保持空闲连接,尤其是在等待 KingbaseES 通知时。这种情况下,客户端如何知道连接仍 然存在,并且没有因为服务器或网络中断而断开?为此,Kdbndp 有一个 keepalive 特性,它可以启动周期性的发 送 Select NULL 查询。此功能默认禁用,必须通过在连接字符串中设置 keepalive 参数来启用,该参数设置每个 keepalive 之间间隔的的秒数。 启用 keepalive 后,如果 keepalive 失败,Kdbndp 将发出 KdbndpConnection.StateChange 事件。 请注意,只有在需要时才应打开此功能。除非知道将使用长期空闲的连接,并且后端(或网络设备)会干扰这些 连接,否则最好不要使用它。 12.1 TCP 保活 keepalive 机制非常适合长期空闲连接,但在查询处理期间不能使用。对于一些类似 KingbaseES 的数据仓库产 品,单个 SQL 语句需要很长实际那才能执行的情况并不少见,并且在此期间无法发送 Select NULL。对于这些情 况,您可能需要打开 TCP keepalive,这与上面描述的应用程序级 keepalive 完全不同。为了更好的理解不同类型的 keepalive,请参阅 博客文章 。如该文章所说,TCP keepalive 依赖于网络堆栈支持,可能并不总是有效,但它是查询 处理期间的唯一选择。 在 Linux 上,您只需在连接字符串中指定 Tcp Keepalive=true 即可启用 keepalive。将使用默认的系统范围设置 (用于间隔、计数…),目前无法在应用程序级别指定这些设置。 在 Windows 上,那您还可以指定 Tcp Keepalive Time 和 Tcp Keepalive Interval 调整这些设置。 34 第 13 章 复制 13章 复制 第 • 二进制复制 • 文本复制 • 原始二进制复制 • Cancel KingbaseES 有一个特性,能高效地从表中批量导入或导出数据:复制。与使用 INSERT 和 SELECT 相比,这 是从表中获取数据更快的方法。 Kdbndp 支持三种 COPY 操作模式:二进制、文本、和原始二进制。 13.1 二进制复制 该模式使用高效的 KingbaseES 二进制格式将数据导入和导出数据库。用户使用 API 来读取和写入 Kdbndp 解 码和编码的行和字段。完成后,必须调用 Complete() 来保存数据,否则将导致 COPY 操作在 writer 释放时回滚。 using (var writer = Conn.BeginBinaryImport( "COPY data(field_text,field_int2) FROM STDIN(FORMAT BINARY)")) { writer.StartRow(); writer.Write("Hello"); writer.Write(8, KdbndpDbType.Smallint); writer.StartRow(); writer.Write("Goodbye"); writer.WriteNull(); writer.Complete(); } 35 第 13 章 复制 using (var reader = Conn.BeginBinaryExport( "COPY data(field_text,field_int2) TO STDOUT (FROMAT BINARY)")) { reader.StartRow(); Consle.WriteLine(reader.Read()); Consle.WriteLine(reader.Read(KdbndpDbType.Smallint)); reader.StartRow(); reader.Skip(); Consle.WriteLine(reader.isNull); Consle.WriteLine(reader.Read()); reader.StartRow(); } 13.2 文本复制 该模式使用 KingbaseES 文本或 CSV 格式将数据导入或导出数据库。用户应适当地格式化文本或 CSV,Kdbndp 只是提供了一个 TextReader 或 Writer。这种模式比二进制复制效率低,主要适用于已经拥有 CSV 或兼容文本格式 的数据、且不关心性能的情况。 using (var writer = conn.BeginTextImport( "COPY data (field_text, field_int4) FROM STDIN")){ writer.Write("HELLO\t1\n"); writer.Write("GOODBYE\t2\n"); } using (var reader = conn.BeginTextExport( "COPY data (field_text, field_int4) TO STDOUT")){ Console.WriteLine(reader.ReadLine()); Console.WriteLine(reader.ReadLine()); } 13.3 原始二进制复制 在这种模式下,数据传输时二进制的,但 Kdbndp 不进行任何编码或解码,数据作为原始.NET 流传输。此模式 仅对批量数据和恢复表有用:表保存为 blob,以后可以进行恢复。如果需要真正理解这些数据,则应该使用常规二进 制模式。 示例: 36 第 13 章 复制 int len; var data = new byte[10000]; using (var inStream = conn.BeginRawBinaryCopy( "COPY table1 TO STDOUT (FORMAT BINARY)")){ len = inStream.Read(data, 0, data.lenth); } using (var outStream = conn.BeginRawBinaryCopy( "COPY table2 FROM STDIN (FORMAT BINARY)")){ outStream.Write(data, 0, len); } 13.4 Cancel 通过调用 importer 对象的 Cancel() 方法,可以在任何时候取消导入操作。在关闭或销毁 importer 之前,不会 向数据库提交任何数据。 导出操作也同样可以通过调用 Cancel() 方法来取消操作。 37 第 14 章 示例 14章 示例 第 下面给出示例,描述了如何通过 KingbaseES .NET Data Provider 操作 KingbaseES 数据库。 • KdbndpConnection 示例 • KdbndpCommand 示例 • KdbndpParameter 示例 • KdbndpDataReader 示例 • KdbndpDataAdapter 示例 • KdbndpTransaction 示例 • EntityFramework6 示例 您可前往 人大金仓官网 下载 Kdbndp 测试用例 。 14.1 KdbndpConnection 示例 如下示例描述了如何建立与数据库的连接。 using System; using System.Data; using Kdbndp; public class TestConnection { public static void Main(string[] args) { string connString = "Server=127.0.0.1;User Id=SYSTEM; Password=MANAGER;Database=TEST;Port=54321"; KdbndpConnection conn = new KdbndpConnection(connString); conn.Open(); conn.Close(); 38 第 14 章 示例 } } 14.2 KdbndpCommand 示例 KdbndpCommand 示例 (1) 如下示例描述了如何在 SCOTT 表中插入一条记录,再删除这条记录。 using System; using System.Data; using Kdbndp; public static class TestCommand { public static void Main(String[] args) { string connString = "Server=127.0.0.1;User Id=SYSTEM; Password=MANAGER;Database=TEST;Port=54321"; KdbndpConnection conn = new KdbndpConnection(connString); conn.Open(); try { Int32 rowsaffected = 0; KdbndpCommand cmd = new KdbndpCommand("insert into SCOTT values(10, 100, 100)", conn); rowsaffected = cmd.ExecuteNonQuery(); Console.WriteLine("It was added {0} lines in table SCOTT", rowsaffected); cmd.CommandText = "delete from SCOTT where GRADE=10 and LOSAL=100 and HISAL=100;"; rowsaffected = cmd.ExecuteNonQuery(); Console.WriteLine("It was delete {0} lines in table SCOTT", rowsaffected); } finally { 39 第 14 章 示例 conn.Close(); } } } KdbndpCommand 示例 (2) 如下示例描述了如何调用用户自定义函数,并将函数返回值显示在屏幕上。 using System; using System.Data; using Kdbndp; /* 创建测试所用表和函数: * * CREATE OR REPLACE INTERNAL FUNCTION FUNCA() * RETURNS int AS * $BODY$ * DECLARE * RET INT; * BEGIN * SELECT COUNT(*) INTO RET FROM SYS_CLASS; * RETURN RET; * END * $BODY$ * LANGUAGE 'plsql'; */ public static class TestFunction { public static void Main(String[] args) { string connString = "Server=127.0.0.1;User Id=SYSTEM; Password=MANAGER;Database=TEST;Port=54321"; KdbndpConnection conn = new KdbndpConnection(connString); try { conn.Open(); KdbndpCommand command = new KdbndpCommand("FUNCA", conn); command.CommandType = CommandType.StoredProcedure; Object result = command.ExecuteScalar(); Console.WriteLine(result); } catch(System.Exception e) 40 第 14 章 示例 { Console.WriteLine(e.Message); } finally { conn.Close(); } } } KdbndpCommand 示例 (3) 兼容 oracle 匿名块调用功能: 使用 oracle 匿名块兼容功能时,需要为 command 设置 CommandType 类型为 DbMode.Oracle,该类型在 KdbndpCommand 中存在,不兼容 SqlCommand 用例如下: static void TestStoredProcedure() { var conn = OpenConnection(); using (var command = new KdbndpCommand("PACK_ZOO.WATCH_MONKEY", conn)) { command.CommandType = CommandType.StoredProcedure; command.DbModeType = DbMode.Oracle; var inParam = new KdbndpParameter("id", DbType.Int32) { Direction = ParameterDirection.Input, Value = 50 }; var outParam = new KdbndpParameter("p_name", DbType.String) { Direction = ParameterDirection.Output, Value = "" }; command.Parameters.Add(inParam); command.Parameters.Add(outParam); var result = command.ExecuteScalar(); Console.WriteLine(outParam.Value); } 41 第 14 章 示例 KdbndpCommand _cmd = new KdbndpCommand(); _cmd.Connection = conn; _cmd.CommandText = @"select id as id from cs_unifyorm where isvalid = 5 and id =:id order by id"; KdbndpParameter p1 = new KdbndpParameter(); p1.Direction = System.Data.ParameterDirection.InputOutput; p1.ParameterName = "id"; p1.Value = 5; p1.DbType = System.Data.DbType.Int32; _cmd.Parameters.Add(p1); _cmd.ExecuteNonQuery(); Console.WriteLine(p1.Value.ToString()); conn.Close(); } 14.3 KdbndpParameter 示例 KdbndpParameter 示例 (1) 如下示例描述了用户如何使用参数 using System; using System.Data; using Kdbndp; public static class TestParameter { public static void Main(String[] args) { string connString = "Server=127.0.0.1;User Id=SYSTEM; Password=MANAGER;Database=TEST;Port=54321"; KdbndpConnection conn = new KdbndpConnection(connString); conn.Open(); using(KdbndpCommand command = new KdbndpCommand("select * from SCOTT where GRADE = :value1", conn)) { 42 第 14 章 示例 command.Parameters.Add(new KdbndpParameter("value1", DbType.Int32)); command.Parameters[0].Value = 4; using(KdbndpDataReader dr = command.ExecuteReader()) { while(dr.Read()) { for (int i = 0; i < dr.FieldCount; i++) Console.Write("{0} \t", dr[i]); Console.WriteLine(); } } } } } KdbndpParameter 示例 (2) 如下示例描述了用户如何使用 KdbndpTypes 中的数据类型 using System; using System.Data; using Kdbndp; using KdbndpTypes; /* * 创建测试所用表和函数: * CREATE TABLE TABLEB(C1 INT, C2 DOUBLE, C3 VARCHAR(50)); */ public static class TestParameter { public static void Main(String[] args) { string connString = "Server=127.0.0.1;User Id=SYSTEM; Password=MANAGER;Database=TEST;Port=54321"; KdbndpConnection conn = new KdbndpConnection(connString); conn.Open(); KdbndpCommand command = new KdbndpCommand("INSERT INTO TABLEB VAlUES(:COL1, :COL2, :COL3)", conn); 43 第 14 章 示例 command.Parameters.Add(new KdbndpParameter("COL1", KdbndpDbType.Integer)); command.Parameters.Add(new KdbndpParameter("COL2", KdbndpDbType.Double)); command.Parameters.Add(new KdbndpParameter("COL3", KdbndpDbType.Varchar)); command.Parameters[0].Value = 100; command.Parameters[1].Value = 12345.123456789; command.Parameters[2].Value = "abcdABCD"; command.ExecuteNonQuery(); conn.Close(); } } 14.4 KdbndpDataReader 示例 如下示例查询 SCOTT 表中所有记录,并在屏幕上显示。 using System; using System.Data; using Kdbndp; public static class TestDataReader { public static void Main(String[] args) { string connString = "Server=127.0.0.1;User Id=SYSTEM; Password=MANAGER;Database=TEST;Port=54321"; KdbndpConnection conn = new KdbndpConnection(connString); KdbndpCommand command = new KdbndpCommand(); KdbndpDataReader dr = null; try { conn.Open(); command.CommandText = "select * from SCOTT"; command.Connection = conn; dr = command.ExecuteReader(); 44 第 14 章 示例 while (dr.Read()) { for (int i = 0; i < dr.FieldCount; i++) Console.WriteLine(dr.GetValue(i)); } } catch (System.Exception e) { Console.WriteLine(e.Message); } finally { dr.Close(); conn.Close(); } } } 14.5 KdbndpDataAdapter 示例 如下示例描述了 Kdbndp 类库与 DataSet 类之间交互的方法。 using System; using System.Data; using Kdbndp; public static class TestDataset { public static void Main(String[] args) { string connString = "Server=127.0.0.1;User Id=SYSTEM; Password=MANAGER;Database=TEST;Port=54321"; KdbndpConnection conn = new KdbndpConnection(connString); DataSet ds = new DataSet(); int i, j, k; conn.Open(); KdbndpCommand command = new KdbndpCommand("select * from sys_class", conn); KdbndpDataAdapter da = new KdbndpDataAdapter(command); da.Fill(ds); 45 第 14 章 示例 for (i = 0; i < ds.Tables.Count; i++) { Console.WriteLine("Table " + i); for (k = 0; k < ds.Tables[i].Columns.Count; k++) { if (k == ds.Tables[i].Columns.Count - 1) Console.WriteLine(ds.Tables[i].Columns[k]. ColumnName); else Console.Write(ds.Tables[i]. Columns[k].ColumnName + "\t\t"); } Console.WriteLine("------------------------------"); for (j = 0; j < ds.Tables[i].Rows.Count; j++) { DataRow dr = ds.Tables[i].Rows[j]; for (k = 0; k < ds.Tables[i].Columns.Count; k++) { if (k == ds.Tables[i].Columns.Count - 1) Console.WriteLine(dr.ItemArray[k]); else Console.Write(dr.ItemArray[k] + "\t\t"); } } } conn.Close(); } } 14.6 KdbndpTransaction 示例 如下示例描述了程序中的事务处理的使用方法。 using System; using System.Data; using Kdbndp; /* 创建测试所用表和函数: 46 第 14 章 示例 CREATE TABLE TABLEA(C1 INT, C2 VARCHAR(10)); INSERT INTO TABLEA VALUES(1, 'ABCD'); INSERT INTO TABLEA VALUES(2, 'abcdefgh'); CREATE OR REPLACE FUNCTION FUNC1() RETURNS REFCURSOR AS DECLARE KREF REFCURSOR; BEGIN OPEN KREF FOR SELECT * FROM TABLEA; RETURN KREF; END; */ public static class TestTransaction { public static void Main(String[] args) { string connString = "Server=127.0.0.1;User Id=SYSTEM; Password=MANAGER;Database=TEST;Port=54321"; KdbndpConnection conn = new KdbndpConnection(connString); conn.Open(); KdbndpTransaction tran = conn.BeginTransaction(); KdbndpCommand command = new KdbndpCommand("FUNC1", conn); command.CommandType = CommandType.StoredProcedure; KdbndpDataReader dr = command.ExecuteReader(); while(dr.Read()) { for (int i = 0; i < dr.FieldCount; i++) Console.WriteLine(dr.GetValue(i)); } dr.Close(); tran.Commit(); conn.Close(); } } 47 第 14 章 示例 14.7 EntityFramework6 示例 如下示例描述了如何简单配置 EntityFramework6 使用。 config 文件的配置信息 C# 应用代码 public class Order { public int Id { get; set; } public string Customer { get; set; } public System.DateTime OrderDate { get; set; } public virtual List OrderDetails { get; set; } } public class OrderContext : DbContext { public OrderContext(string connectionName) : base(connectionName) { } 48 第 14 章 示例 public DbSet Orders { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.HasDefaultSchema("PUBLIC"); } } static void Main(string[] args) { using (var ctx = new OrderContext("CodeFirstDb")) { var o = new Order(); o.OrderDate = DateTime.Now; ctx.Orders.Add(o); ctx.SaveChanges(); var query = from order in ctx.Orders select order; foreach (var q in query) { Console.WriteLine("OrderId:{0},OrderDate:{1}", q.Id, q.OrderDate); } ctx.Database.Delete(); Console.Read(); } } 49 版权声明 版权声明 北京人大金仓信息技术股份有限公司(简称:人大金仓)版权所有,并保留对本手册及本声明的一切权利。 未得到人大金仓的书面许可,任何人不得以任何方式或形式对本手册内的任何部分进行复制、摘录、备份、修 改、传播、翻译成其他语言、将其全部或部分用于商业用途。 免责声明 本手册内容依据现有信息制作,由于产品版本升级或其他原因,其内容有可能变更。人大金仓保留在没有任何通 知或者提示的情况下对手册内容进行修改的权利。 本手册仅作为使用指导,人大金仓在编写本手册时已尽力保证其内容准确可靠,但并不确保手册内容完全没有错 误或遗漏,本手册中的所有信息也不构成任何明示或暗示的担保。 技术支持 • 人大金仓官方网站:http://www.kingbase.com.cn/ • 人大金仓文档中心:http://help.kingbase.com.cn/ • 全国服务热线:400-601-1188 • 人大金仓技术支持与反馈信箱:support@kingbase.com.cn 50 服务周期承诺 服务周期承诺 由于市场需求在不断变化,技术创新和发展的进程不断加剧,产品的版本更迭不可避免。人大金仓对于产品版本 生命周期的有效管理,有助于您提前规划项目,更好地从产品服务终止上过渡。 表 1: KingbaseES 产品生命周期里程碑 关键里程碑点 定义 产品发布日期 产品正式发布版本,即 GA(general availability)版本的发布日期。 停止销售日期 正式停止销售的日期,版本停止接受订单日。该日之后,产品将不再销售。 停止功能升级日期 在该日期之后,不再提供新特性和新硬件支持。但依旧提供错误修复、安全修复、功 能维护等服务。 停止功能维护日期 在该日期之后,不再维护功能,修复问题。但依旧提供安全修复等服务 停止安全维护日期 在该日期之后,不再发布补丁版本修复中高风险漏洞,仅提供有限的支持。 产品服务终止日期 停止提供产品服务和支持的日期。包括软件维护版本,缺陷修复,以及针对该产品的 所有服务支持(包括服务热线和远程/现场支持)。 服务周期策略 金仓数据库管理系统 KingbaseES 产品确保以下的服务周期: 1)产品自发布之日起至产品停止功能升级(包含新特性、新硬件支持)之日不少于 5 年。 2)产品停止功能升级之日起至产品停止功能维护(主要包括问题修复)之日不少于 4 年。 3)产品功能维护停止之日起至产品停止安全维护(包括中高风险漏洞修复)之日不少于 2 年。 服务终止策略 金仓数据库管理系统 KingbaseES 产品确保在销售后,至少提供 6 年的服务支持。 注意: 人大金仓将会综合各方因素来确定产品服务终止日期。并将在实际产品服务终止日期之前至少 90 天,通过公 51 服务周期承诺 开方式宣布产品服务终止日期。 52

相关文章