zoukankan      html  css  js  c++  java
  • asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 连接数据库

    在.netstandard2.0时 System.Data.Common 这个包里并没有加入DbProviderFactories
    DbProviderFactories类在.netframework中是非常重要的存在,依靠他可以适配各种数据库客户端(sqlserver、mysql、sqllite等)创建数据库连接。
    现在 随着.netcore3.0的正式发布,已经实现了.netstandard2.1,并且在此版本中实现了 DbProviderFactories
    image.png

    现在可以像.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项目一样的使用了。

  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/sands/p/11594927.html
Copyright © 2011-2022 走看看