.NET Core 3.0中的数据库驱动框架System.Data

2019 年 1 月 29 日

.NET Core 3.0中的数据库驱动框架System.Data

虽然没有得到很多关注,但System.Data对于.NET 中任何关系型数据库的访问都至关重要。因为其前身是 ActiveX Data Objects,所以它也被称为ADO.NET。System.Data 提供了一个通用框架,是构建.NET 数据库驱动程序的基础。该框架提供了数据库驱动可以遵循的具体规范。


连接、命令和数据读取器都基于双重继承模式。它们分别从 DbConnection、DbCommand 和 DbDataReader 继承了一些基本功能。它们还实现了抽象接口 IDbConnection、IDbCommand 和 IDbDataReader,这些接口可以模拟场景和非传统数据源。这种双重继承模式也适用于下面描述的所有基类。


虽然连接字符串通常被视为字符串,但有一些工具可以将它们表示为从 DbConnectionStringBuilder 继承的对象。这可以处理特定数据库的连接字符串解析,并使开发人员可以更好地了解特定数据库提供的设置。


System.Data 早于 ORMs for .NET,但它确实提供了一种通过实现 DbDataAdapter 和 DbCommandBuilder 类生成 SQL 的通用方法。这既可以直接使用,也可以与普通数据集和类型化数据集结合使用。


如果你正在寻找抽象工厂模式的真实示例,请查看 DbProviderFactory。它的子类提供了连接、命令、命令参数、命令构建器和数据适配器。基本上是数据访问所需的一切,而不需要特定于数据库的逻辑。


接口的问题


如上所述,System.Data 依赖于双重继承。在添加新方法时,这可能是一个问题。例如,.NET 4.5 中的 DbCommand 增加了异步操作。但是,它们无法添加到相应的 IDbCommand 接口中,因为这将是一个破坏性更改。这意味着你不能同时使用异步操作和容易模拟的抽象接口。


微软本可以在.NET Core 1.0 中一次性重置抽象接口,使其与抽象类相匹配(Java 过去在 JDBC 接口中就这样做过)。然而,这会使与.NET Framework 共享代码变得困难。


如果 C# 8 中包含默认接口方法,那么理论上可以使用它们以向后兼容的方式重新组合接口。但是,由于默认接口方法是.NET Core 才有的特性,所以它与.NET Framework 不兼容,也就不能用于旧的编译器和其他.NET语言


DbDataReader.Get()字符串重载 #31595*


.NET Core 3.0 的第一个特性是能够将列名传递给DbDataReader.GetXXX方法。长期以来,人们一直抱怨这个接口不能按名称引用列。这意味着你需要使用下面这个模式:


reader.GetInt32(reader.GetOrdinal("columnName"))
复制代码


显然(对有些人来说,早就该这样了),简化方式是提供一个字符串重载( string overload):


reader.GetInt32("columnName")
复制代码


Oracle 的 Connector/NET 和MySqlConnector已经这样做了。


因为性能原因,这个新方法不会被标记为 virtual,从而使 JIT 编译器可以轻松地将它内联。由于上述原因,新的方法集不会添加到 IDbDataReader 中。


XmlDataDocument #33442


如果你了解XmlDataDocument的历史,那么这似乎是一个奇怪的选择。自从.NET 4.0 在 2010 年发布以来,它就已经被标记为过时,并警告说“XmlDataDocument 类将在未来的版本中被删除”。


现在重新开始使用它的原因是一些 WinForms 和 WPF 应用程序在使用它。Bug报告显示,“它在 Apiport 的不同类别中有 1-7%的使用率。”


DatasetExtensions


.NET Core 3 中没有的一个特性是DataTableExtensions类。虽然看起来非常简单,只有 6 个扩展方法,但是如果不修改 System.Data 本身,就无法构建 AsDataView。原因相当复杂,涉及内部方法、类型转发和.NET 标准带来的挑战。


如果你感兴趣,可以看下相关的话题,包括“将DatasetExtensions移植到.NET Core #19771”、“移植DataTable.AsDataView扩展方法 #27610”和“公开涉及在DataView中进行键搜索的内部虚拟方法 #31764”。


查看英文原文:System.Data in .NET Core 3.0


2019 年 1 月 29 日 15:185404
用户头像

发布了 323 篇内容, 共 140.6 次阅读, 收获喜欢 661 次。

关注

评论

发布
暂无评论
发现更多内容

量化交易系统开发搭建案例

薇電13242772558

区块链 策略模式

由于不知线程池的bug,某Java程序员叕被祭天

Java架构师迁哥

Redis实战丨阿里架构师耗时三年写出的Redis实战文档PDF

Java成神之路

Java 程序员 架构 面试 编程语言

倍频程与钢琴调式的距离

阿里云视频云

音频技术 音频

GitHub上3天1W赞的程序员学习路线!入门进阶都非常实用

Java架构之路

Java 程序员 架构 面试 编程语言

OPPO小布助手正在改变普罗米修斯的世界

脑极体

阿里开发10年,全部心血汇聚成到这份文档里,拿到30W的offer没问题

Java架构之路

Java 程序员 架构 面试 编程语言

云服务的可服务性经典6问

华为云开发者社区

服务 计算

大众汽车“芯片荒”,折射汽车芯片的漫漫“自主替代”路

脑极体

英特尔宋继强:迈向可持续的千倍速计算未来

intel001

2020,谁是中国ToB行业最有影响力的企业?

ToB行业头条

架构师训练营W10作业

Geek_f06ede

测开之函数进阶· 第2篇《纯函数》

清菡

测试开发

图解HTTP权威指南(一)| HTTP报文

李先生

运维 HTTP

脑洞:如何用一个整数来表示一个列表?

Python猫

Python

TypeScript | 第二章:类、接口和之间的关系

梁龙先森

typescript 前端 七日更

volatile,synchronized可见性,有序性,原子性代码证明(基础硬核)

叫练

volatile 多线程 synchronized 原子性 指令

大连市税务局局长赵福增:用区块链打破部门间“信息孤岛”

CECBC区块链专委会

区块链 汽车

13W字!腾讯高工手写“Netty速成手册”,3天能走向实战

周老师

Java 编程 程序员 架构 面试

【Java入门】流

HQ数字卡

Java 七日更

距离 Java 开发者玩转 Serverless,到底还有多远?

阿里巴巴云原生

Java Serverless 微服务 云原生 中间件

学透这份300页的2020最新java面试题及答案,一线大厂offer随便拿

Java架构之路

Java 程序员 架构 面试 编程语言

“区块链+社会治理”模式获居民点赞

CECBC区块链专委会

区块链 区块链投票

神比喻:低代码开发像自动驾驶汽车,零代码开发像无人驾驶汽车!

低代码指南

程序员 软件 开发者 低代码 开发工具

Reactive Spring实战 -- 理解Reactor的设计与实现

binecy

reactor Reactive SpringBoot 2

大作业1

追风

架构师一期

阿里架构师478页Java工程师面试知识解析笔记pdf,一份2021年通往阿里的面试指南

Java架构之路

Java 程序员 架构 面试 编程语言

比特币10年:从2个披萨涨到2万美金,背后的三个“神秘人”

CECBC区块链专委会

比特币

MSHA x Chaos 容灾高可用实践

阿里巴巴云原生

数据库 高可用 云原生 中间件 容灾

PostgreSQL:您可能需要增加MAX_LOCKS_PER_TRANSACTION

PostgreSQLChina

数据库 postgresql 开源

LeetCode题解:55. 跳跃游戏,贪心,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

.NET Core 3.0中的数据库驱动框架System.Data-InfoQ