1. 程式人生 > >asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 連線資料庫

asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 連線資料庫

在.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專案一樣的使用了