在.netstandard2.0时 System.Data.Common 这个包里并没有加入DbProviderFactories

DbProviderFactories类在.netframework中是非常重要的存在,依靠他可以适配各种数据库客户端(sqlserver、mysql、sqllite等)创建数据库连接。

现在 随着.netcore3.0的正式发布,已经实现了.netstandard2.1,并且在此版本中实现了 DbProviderFactories

现在可以像.netframework中一样愉快的使用

 DbProviderFactory factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");

但是如果直接这么写代码的话就会报错

System.ArgumentException:“The specified invariant name 'MySql.Data.MySqlClient' wasn't found in the list of registered .NET Data Providers.”

NET Core的数据库连接与.NET Framework略有不同。在.NET Framework中,程序可用的数据库驱动程序在整个系统范围内(通过machine.config)自动可用。也就是 mysql的.net连接驱动(mysql-connector-net-x.x.x.x.msi)就可以了。

而.NET Core中不是这种情况,您必须注册要使用的数据库驱动程序-通常在Program.cs或中Startup.cs。使用 以下DbProviderFactories.RegisterFactory方法完成注册:

SQL服务器

using System.Data.SqlClient;
DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);

MySQL的

using MySql.Data.MySqlClient;
DbProviderFactories.RegisterFactory("MySql.Data.MySqlClient", MySqlClientFactory.Instance);

PostgreSQL的

using Npgsql;
DbProviderFactories.RegisterFactory("Npgsql", NpgsqlFactory.Instance);

SQLite的

using Microsoft.Data.Sqlite;
DbProviderFactories.RegisterFactory("Microsoft.Data.Sqlite", SqliteFactory.Instance);

这些数据库访问工厂的单例都是继承DbProviderFactory,需要通过nuget安装对应的数据库客户端包例如 Mysql.Data

在这之后就是在需要的地方使用

DbProviderFactory  factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");
//创建一个数据客户端连接
DbConnection conn = factory.CreateConnection();

升级

在上述方法过程中是使用的直接注册工厂单例完成的;

按照官方的API 可以使用注册指定的工厂类型和应用程序集来完成

//
// 参数:
// providerInvariantName:
//
// factoryTypeAssemblyQualifiedName:
public static void RegisterFactory(string providerInvariantName, string factoryTypeAssemblyQualifiedName);

例如mysql

  DbProviderFactories.RegisterFactory(providerName, "MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data");

前面是工厂的类型名称,后面是类所在的应用程序集,即可达到同样的效果;

这样的好处就是自己在封装数据库方法的时候不需要再将mysql,sqlserver的包一起打入到框架中,而是交由使用的web或者desktop项目来加载数据库客户端包,用法就可以像 .netframework项目一样的使用了。

最新文章

  1. AngularJS之中级Route【二】(七)
  2. Struts2 OGNL案例
  3. ThreadLocal实现方式&使用介绍—无锁化线程封闭
  4. 【使用Unity开发Windows Phone上的2D游戏】(2)初识工具
  5. 使用freemarker生成word,步骤详解并奉上源代码
  6. js截取所需字符串长度
  7. Nginx完整配置说明
  8. python Day 2 - 编写数据库模块
  9. [Design Pattern] Factory Pattern 简单案例
  10. apicloud ios 打包流程
  11. [笔记]FTRL与Online Optimization
  12. python paramiko模块 用密钥传输
  13. 用Python最原始的函数模拟eval函数的浮点数运算功能
  14. jQuery事件绑定,解绑,触发
  15. Hive数据倾斜解决方案
  16. Windows server 2012 卸载iis 黑屏
  17. vue跨域解决方法
  18. Ubuntu 16.04 LTS 安装Mongodb 3.4
  19. 为什么说 HashMap 是非线程安全的?
  20. WPF实战案例-MVVM模式下在Xaml中弹出窗体

热门文章

  1. input样式重置(outline:none)
  2. Git安装与使用(windows环境)(一)----Git安装、生成公钥和私钥、添加SSH
  3. MYSQL批量导入数据报:[Err] 2006 - MySQL server has gone away 解决方法
  4. Unity之SDK接入(Unity与Android通信)
  5. ‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析
  6. CAD数据分块,偏移校准,加载到百度地图、高德地图、谷歌等地图上
  7. tensorflow学习笔记——自编码器及多层感知器
  8. 不修改的主席(HJT)树-HDU2665,POJ-2104;
  9. codeforces 764 C. Timofey and a tree(dfs+思维)
  10. 接口压测工具WRK的学习与使用