強大的資料庫操作類DBHelper
阿新 • • 發佈:2019-02-04
本示例程式碼的關鍵是利用.net庫自帶的DbProviderFactory來生產資料庫操作物件。
從下圖中,可以看到其的多個核心方法,這些方法將在我們的超級DBHelper中使用。
仔細研究,你會發現每個資料庫的官方支援dll都有一個Instance物件,這個物件都是繼承了DbProviderFactory了。
因此利用這點,我們就可以實現相容多種資料的超級DBHelper了。
以下為示例程式碼,僅供參考學習,程式碼只是我的ORM框架中的一個片段(其中暫時支援了SQLSERVER、MYSQL、SQLITE三種資料庫,LoadDbProviderFactory方法是將封裝在dll中的資料庫操作dll反射載入例項化的方法。):
- /// <summary>
- /// 超級資料庫操作類
- /// <para>2015年12月21日</para>
- /// <para>v1.0</para>
- /// <para>葉琪</para>
- /// </summary>
- publicclass DBHelper
- {
- #region 屬性
-
private DbProviderFactory _DbFactory;
- private DBConfig mDBConfig;
- /// <summary>
- /// 資料庫連線配置
- /// </summary>
- public DBConfig DBConfig
- {
- get { return mDBConfig; }
- }
- /// <summary>
- /// 表示一組方法,這些方法用於建立提供程式對資料來源類的實現的例項。
-
/// </summary>
- public DbProviderFactory DbFactory
- {
- get { return _DbFactory; }
- set { _DbFactory = value; }
- }
- #endregion
- #region 建構函式
- public DBHelper(DBConfig aORMConfig)
- {
- mDBConfig = aORMConfig;
- switch (mDBConfig.DBType)
- {
- case ORMType.DBTypes.SQLSERVER:
- _DbFactory = System.Data.SqlClient.SqlClientFactory.Instance;
- break;
- case ORMType.DBTypes.MYSQL:
- LoadDbProviderFactory("MySql.Data.dll", "MySql.Data.MySqlClient.MySqlClientFactory");
- break;
- case ORMType.DBTypes.SQLITE:
- LoadDbProviderFactory("System.Data.SQLite.dll", "System.Data.SQLite.SQLiteFactory");
- break;
- }
- }
- /// <summary>
- /// 動態載入資料庫封裝庫
- /// </summary>
- /// <param name="aDLLName">資料庫封裝庫檔名稱</param>
- /// <param name="aFactoryName">工廠路徑名稱</param>
- privatevoid LoadDbProviderFactory(string aDLLName, string aFactoryName)
- {
- string dllPath = string.Empty;
- if (System.AppDomain.CurrentDomain.RelativeSearchPath != null)
- {
- dllPath = System.AppDomain.CurrentDomain.RelativeSearchPath+"\\"+ aDLLName;
- }
- else
- {
- dllPath = System.AppDomain.CurrentDomain.BaseDirectory + aDLLName;
- }
- if (!File.Exists(dllPath))
- {//檔案不存在,從庫資源中複製輸出到基目錄下
- FileStream fdllFile = new FileStream(dllPath,FileMode.Create);
- byte[] dllData = null;
- if (aDLLName == "System.Data.SQLite.dll")
- {
- dllData = YFmk.ORM.Properties.Resources.System_Data_SQLite;
- }
- elseif (aDLLName == "MySql.Data.dll")
- {
- dllData = YFmk.ORM.Properties.Resources.MySql_Data;
- }
- fdllFile.Write(dllData, 0, dllData.Length);
- fdllFile.Close();
- }
- Assembly libAssembly = Assembly.LoadFile(dllPath);
- Type type = libAssembly.GetType(aFactoryName);
- foreach (FieldInfo fi in type.GetFields(BindingFlags.Static | BindingFlags.Public))
- {
- if (fi.Name == "Instance")
- {
- _DbFactory = fi.GetValue(null) as DbProviderFactory;
- return;
- }
- }
- }
- #endregion
- #region 資料庫操作
- /// <summary>
- /// 執行一條計算查詢結果語句,返回查詢結果
- /// </summary>
- /// <param name="aSQLWithParameter">SQL語句及引數</param>
- /// <returns>查詢結果(object)</returns>
- publicobject GetSingle(SQLWithParameter aSQLWithParameter)
- {
- using (DbConnection conn = _DbFactory.CreateConnection())
- {
- conn.ConnectionString = mDBConfig.ConnString;
- using (DbCommand cmd = _DbFactory.CreateCommand())
- {
- PrepareCommand(cmd, conn, aSQLWithParameter.SQL.ToString(), aSQLWithParameter.Parameters);
- object obj = cmd.ExecuteScalar();
- cmd.Parameters.Clear();
- if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
- {
- returnnull;
- }
- else
- {