虽然没有得到很多关注,但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(\u0026quot;columnName\u0026quot;))

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

reader.GetInt32(\u0026quot;columnName\u0026quot;)

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

.NET Core 3.0中的数据库驱动框架System.Data相关推荐

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

    虽然没有得到很多关注,但System.Data对于.NET 中任何关系型数据库的访问都至关重要.因为其前身是 ActiveX Data Objects,所以它也被称为 ADO.NET.System.D ...

  2. ASP.NET Core 3.1 Web API和EF Core 5.0 中具有泛型存储库和UoW模式的域驱动设计实现方法

    目录 介绍 背景 领域驱动设计 存储库模式 工作单元模式 使用代码 创建空白解决方案和解决方案架构 添加和实现应用程序共享内核库 PageParam.cs 在Entity Framework Core ...

  3. .NET Core 3.0 中的新变化

    译者:楚人Leo 译文:http://www.cnblogs.com/leolion/p/10585834.html 原文:https://msdn.microsoft.com/en-us/magaz ...

  4. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  5. 使用内存数据库的.NET Core 3.0中基于身份(Identity-Based)的身份验证

    目录 介绍 背景 先决条件 创建Web应用程序的步骤 第1步 第2步 第3步 第4步 第5步 第6步 运行您的应用程序 总结 下载源9.5 MB 介绍 身份验证是根据系统或用户的身份确定或给予其个人访 ...

  6. 在ASP.NET Core 2.0中创建Web API

    目录 介绍 先决条件 软件 技能 使用代码 第01步 - 创建项目 第02步 - 安装Nuget包 步骤03 - 添加模型 步骤04 - 添加控制器 步骤05 - 设置依赖注入 步骤06 - 运行We ...

  7. Net Core 6.0 webApi+sqlServer数据库教程实战

    Net Core 6.0 webApi+sqlServer数据库教程实战 教程前言 安装net core 环境 构建wepApi项目 操作数据库 接口调用 相关快速扩展 总结 教程前言 本教程从构建项 ...

  8. 避免在 ASP.NET Core 3.0 中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0 类库转换为.NET Core 3.0 类库 Part 2 - IHostin ...

  9. IHostingEnvironment VS IHostEnvironment - .NET Core 3.0中的废弃类型

    原文:https://andrewlock.net/ihostingenvironment-vs-ihost-environment-obsolete-types-in-net-core-3/ 作者: ...

最新文章

  1. 日志中台不重不丢实现浅谈
  2. pack php 详解_函数pack的使用详解
  3. java_io_listFile()的应用和匿名内部类
  4. linux shell 网盘,linux在shell中获取时间
  5. Shiro表结构设计
  6. Node.js设置CORS跨域请求中多域名白名单的方法
  7. 直接拿来用!Visual Studio 扩展工具利用 AI 强化你的代码
  8. VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件
  9. java reactor模式例子_JAVA BIO,NIO,Reactor模式总结
  10. 基于CentOS7上的搭建javaweb环境 - 学习笔记
  11. 有关C语言联合体(union)的使用
  12. 华为设备VRRP+MSTP冗余负载均衡实现
  13. C/C++教程 第十七章 —— MFC开发多人聊天室
  14. 高等数学 常用数学公式
  15. xp ie清除css缓存,如何清空浏览器的CSS缓存
  16. vue+离线百度地图
  17. 微信策划推出指纹支付
  18. 【Tools系列】之Excel冻结窗格
  19. container 和initContainers使用
  20. C# Excel插入Object

热门文章

  1. java的abstract的意思_java – spring中的abstract =“true”是什么意思?
  2. source insight 函数不能跳到definition_小技能: Windows10突然不能复制粘贴谁搞鬼
  3. php 打开pdf文件附件,pdf里怎么链接到附件
  4. linux离线安装redmine_Linux 下一款非常好用的翻译软件
  5. Python中的除法保留两位小数
  6. Code Review的重要性
  7. 【javascript】异步编年史,从“纯回调”到Promise
  8. Label 表达式绑定
  9. js(function(){alert(‘’‘)})
  10. Ms SQL Server 约束和规则