1. 程式人生 > >強大的資料庫操作類DBHelper

強大的資料庫操作類DBHelper

本示例程式碼的關鍵是利用.net庫自帶的DbProviderFactory來生產資料庫操作物件。

從下圖中,可以看到其的多個核心方法,這些方法將在我們的超級DBHelper中使用。



仔細研究,你會發現每個資料庫的官方支援dll都有一個Instance物件,這個物件都是繼承了DbProviderFactory了。

因此利用這點,我們就可以實現相容多種資料的超級DBHelper了。

以下為示例程式碼,僅供參考學習,程式碼只是我的ORM框架中的一個片段(其中暫時支援了SQLSERVER、MYSQL、SQLITE三種資料庫,LoadDbProviderFactory方法是將封裝在dll中的資料庫操作dll反射載入例項化的方法。):

[csharp] view plain copy  print?
  1. /// <summary>
  2.     /// 超級資料庫操作類
  3.     /// <para>2015年12月21日</para>
  4.     /// <para>v1.0</para>
  5.     /// <para>葉琪</para>
  6.     /// </summary>
  7.     publicclass DBHelper  
  8.     {  
  9.         #region 屬性
  10.         private DbProviderFactory _DbFactory;  
  11.         private DBConfig mDBConfig;  
  12.         /// <summary>
  13.         /// 資料庫連線配置
  14.         /// </summary>
  15.         public DBConfig DBConfig  
  16.         {  
  17.             get { return mDBConfig; }  
  18.         }  
  19.         /// <summary>
  20.         /// 表示一組方法,這些方法用於建立提供程式對資料來源類的實現的例項。
  21.         /// </summary>
  22.         public DbProviderFactory DbFactory  
  23.         {  
  24.             get { return _DbFactory; }  
  25.             set { _DbFactory = value; }  
  26.         }  
  27.         #endregion
  28.         #region 建構函式
  29.         public DBHelper(DBConfig aORMConfig)  
  30.         {  
  31.             mDBConfig = aORMConfig;  
  32.             switch (mDBConfig.DBType)  
  33.             {  
  34.                 case ORMType.DBTypes.SQLSERVER:  
  35.                     _DbFactory = System.Data.SqlClient.SqlClientFactory.Instance;  
  36.                     break;  
  37.                 case ORMType.DBTypes.MYSQL:  
  38.                     LoadDbProviderFactory("MySql.Data.dll""MySql.Data.MySqlClient.MySqlClientFactory");  
  39.                     break;  
  40.                 case ORMType.DBTypes.SQLITE:  
  41.                     LoadDbProviderFactory("System.Data.SQLite.dll""System.Data.SQLite.SQLiteFactory");  
  42.                     break;  
  43.             }  
  44.         }  
  45.         /// <summary>
  46.         /// 動態載入資料庫封裝庫
  47.         /// </summary>
  48.         /// <param name="aDLLName">資料庫封裝庫檔名稱</param>
  49.         /// <param name="aFactoryName">工廠路徑名稱</param>
  50.         privatevoid LoadDbProviderFactory(string aDLLName, string aFactoryName)  
  51.         {  
  52.             string dllPath = string.Empty;  
  53.             if (System.AppDomain.CurrentDomain.RelativeSearchPath != null)  
  54.             {  
  55.                 dllPath = System.AppDomain.CurrentDomain.RelativeSearchPath+"\\"+ aDLLName;  
  56.             }  
  57.             else
  58.             {  
  59.                 dllPath = System.AppDomain.CurrentDomain.BaseDirectory + aDLLName;  
  60.             }  
  61.             if (!File.Exists(dllPath))  
  62.             {//檔案不存在,從庫資源中複製輸出到基目錄下
  63.                 FileStream fdllFile = new FileStream(dllPath,FileMode.Create);  
  64.                 byte[] dllData = null;  
  65.                 if (aDLLName == "System.Data.SQLite.dll")  
  66.                 {  
  67.                     dllData = YFmk.ORM.Properties.Resources.System_Data_SQLite;  
  68.                 }  
  69.                 elseif (aDLLName == "MySql.Data.dll")  
  70.                 {  
  71.                     dllData = YFmk.ORM.Properties.Resources.MySql_Data;  
  72.                 }  
  73.                 fdllFile.Write(dllData, 0, dllData.Length);  
  74.                 fdllFile.Close();  
  75.             }  
  76.             Assembly libAssembly = Assembly.LoadFile(dllPath);  
  77.             Type type = libAssembly.GetType(aFactoryName);  
  78.             foreach (FieldInfo fi in type.GetFields(BindingFlags.Static | BindingFlags.Public))  
  79.             {  
  80.                 if (fi.Name == "Instance")  
  81.                 {  
  82.                     _DbFactory = fi.GetValue(nullas DbProviderFactory;  
  83.                     return;  
  84.                 }  
  85.             }  
  86.         }  
  87.         #endregion
  88.         #region 資料庫操作
  89.         /// <summary>
  90.         /// 執行一條計算查詢結果語句,返回查詢結果
  91.         /// </summary>
  92.         /// <param name="aSQLWithParameter">SQL語句及引數</param>
  93.         /// <returns>查詢結果(object)</returns>
  94.         publicobject GetSingle(SQLWithParameter aSQLWithParameter)  
  95.         {  
  96.             using (DbConnection conn = _DbFactory.CreateConnection())  
  97.             {  
  98.                 conn.ConnectionString = mDBConfig.ConnString;  
  99.                 using (DbCommand cmd = _DbFactory.CreateCommand())  
  100.                 {  
  101.                     PrepareCommand(cmd, conn, aSQLWithParameter.SQL.ToString(), aSQLWithParameter.Parameters);  
  102.                     object obj = cmd.ExecuteScalar();  
  103.                     cmd.Parameters.Clear();  
  104.                     if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))  
  105.                     {  
  106.                         returnnull;  
  107.                     }  
  108.                     else
  109.                     {