久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    強大的數據庫操作類DBHelper

     黃金屋1 2017-09-11

     本示例代碼的關鍵是利用.net庫自帶的DbProviderFactory來生產數據庫操作對象。

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



    仔細研究,你會發現每個數據庫的官方支持dll都有一個Instance對象,這個對象都是繼承了DbProviderFactory了。

    因此利用這點,我們就可以實現兼容多種數據的超級DBHelper了。

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

    [csharp] view plain copy  
    1. /// <summary>  
    2.     /// 超級數據庫操作類  
    3.     /// <para>2015年12月21日</para>  
    4.     /// <para>v1.0</para>  
    5.     /// <para>葉琪</para>  
    6.     /// </summary>  
    7.     public class DBHelper  
    8.     {  
    9.         #region 屬性  
    10.         private DbProviderFactory _DbFactory;  
    11.         private DBConfig mDBConfig;  
    12.           
    13.         /// <summary>  
    14.         /// 數據庫連接配置  
    15.         /// </summary>  
    16.         public DBConfig DBConfig  
    17.         {  
    18.             get { return mDBConfig; }  
    19.         }  
    20.   
    21.         /// <summary>  
    22.         /// 表示一組方法,這些方法用于創建提供程序對數據源類的實現的實例。  
    23.         /// </summary>  
    24.         public DbProviderFactory DbFactory  
    25.         {  
    26.             get { return _DbFactory; }  
    27.             set { _DbFactory = value; }  
    28.         }  
    29.         #endregion  
    30.  
    31.         #region 構造函數  
    32.         public DBHelper(DBConfig aORMConfig)  
    33.         {  
    34.             mDBConfig = aORMConfig;  
    35.             switch (mDBConfig.DBType)  
    36.             {  
    37.                 case ORMType.DBTypes.SQLSERVER:  
    38.                     _DbFactory = System.Data.SqlClient.SqlClientFactory.Instance;  
    39.                     break;  
    40.                 case ORMType.DBTypes.MYSQL:  
    41.                     LoadDbProviderFactory("MySql.Data.dll""MySql.Data.MySqlClient.MySqlClientFactory");  
    42.                     break;  
    43.                 case ORMType.DBTypes.SQLITE:  
    44.                     LoadDbProviderFactory("System.Data.SQLite.dll""System.Data.SQLite.SQLiteFactory");  
    45.                     break;  
    46.             }  
    47.         }  
    48.   
    49.         /// <summary>  
    50.         /// 動態載入數據庫封裝庫  
    51.         /// </summary>  
    52.         /// <param name="aDLLName">數據庫封裝庫文件名稱</param>  
    53.         /// <param name="aFactoryName">工廠路徑名稱</param>  
    54.         private void LoadDbProviderFactory(string aDLLName, string aFactoryName)  
    55.         {  
    56.             string dllPath = string.Empty;  
    57.             if (System.AppDomain.CurrentDomain.RelativeSearchPath != null)  
    58.             {  
    59.                 dllPath = System.AppDomain.CurrentDomain.RelativeSearchPath+"\\"+ aDLLName;  
    60.             }  
    61.             else  
    62.             {  
    63.                 dllPath = System.AppDomain.CurrentDomain.BaseDirectory + aDLLName;  
    64.             }  
    65.             if (!File.Exists(dllPath))  
    66.             {//文件不存在,從庫資源中復制輸出到基目錄下  
    67.                 FileStream fdllFile = new FileStream(dllPath,FileMode.Create);  
    68.                 byte[] dllData = null;  
    69.                 if (aDLLName == "System.Data.SQLite.dll")  
    70.                 {  
    71.                     dllData = YFmk.ORM.Properties.Resources.System_Data_SQLite;  
    72.                 }  
    73.                 else if (aDLLName == "MySql.Data.dll")  
    74.                 {  
    75.                     dllData = YFmk.ORM.Properties.Resources.MySql_Data;  
    76.                 }  
    77.                 fdllFile.Write(dllData, 0, dllData.Length);  
    78.                 fdllFile.Close();  
    79.             }  
    80.             Assembly libAssembly = Assembly.LoadFile(dllPath);  
    81.             Type type = libAssembly.GetType(aFactoryName);  
    82.             foreach (FieldInfo fi in type.GetFields(BindingFlags.Static | BindingFlags.Public))  
    83.             {  
    84.                 if (fi.Name == "Instance")  
    85.                 {  
    86.                     _DbFactory = fi.GetValue(nullas DbProviderFactory;  
    87.                     return;  
    88.                 }  
    89.             }  
    90.         }  
    91.         #endregion  
    92.  
    93.         #region 數據庫操作  
    94.         /// <summary>  
    95.         /// 執行一條計算查詢結果語句,返回查詢結果  
    96.         /// </summary>  
    97.         /// <param name="aSQLWithParameter">SQL語句及參數</param>  
    98.         /// <returns>查詢結果(object)</returns>  
    99.         public object GetSingle(SQLWithParameter aSQLWithParameter)  
    100.         {  
    101.             using (DbConnection conn = _DbFactory.CreateConnection())  
    102.             {  
    103.                 conn.ConnectionString = mDBConfig.ConnString;  
    104.                 using (DbCommand cmd = _DbFactory.CreateCommand())  
    105.                 {  
    106.                     PrepareCommand(cmd, conn, aSQLWithParameter.SQL.ToString(), aSQLWithParameter.Parameters);  
    107.                     object obj = cmd.ExecuteScalar();  
    108.                     cmd.Parameters.Clear();  
    109.                     if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))  
    110.                     {  
    111.                         return null;  
    112.                     }  
    113.                     else  
    114.                     {  
    115.                         return obj;  
    116.                     }  
    117.                 }  
    118.             }  
    119.         }  
    120.   
    121.         /// <summary>  
    122.         /// 執行SQL語句,返回影響的記錄數  
    123.         /// </summary>  
    124.         /// <param name="aSQL">SQL語句</param>  
    125.         /// <returns>影響的記錄數</returns>  
    126.         public int ExecuteSql(string aSQL)  
    127.         {  
    128.             using (DbConnection conn = _DbFactory.CreateConnection())  
    129.             {  
    130.                 conn.ConnectionString = mDBConfig.ConnString;  
    131.                 using (DbCommand cmd = _DbFactory.CreateCommand())  
    132.                 {  
    133.                     PrepareCommand(cmd, conn, aSQL);  
    134.                     int rows = cmd.ExecuteNonQuery();  
    135.                     cmd.Parameters.Clear();  
    136.                     return rows;  
    137.                 }  
    138.             }  
    139.         }  
    140.   
    141.         /// <summary>  
    142.         /// 執行SQL語句,返回影響的記錄數  
    143.         /// </summary>  
    144.         /// <param name="aSQLWithParameter">SQL語句及參數</param>  
    145.         /// <returns></returns>  
    146.         public int ExecuteSql(SQLWithParameter aSQLWithParameter)  
    147.         {  
    148.             using (DbConnection conn = _DbFactory.CreateConnection())  
    149.             {  
    150.                 conn.ConnectionString = mDBConfig.ConnString;  
    151.                 using (DbCommand cmd = _DbFactory.CreateCommand())  
    152.                 {  
    153.                     PrepareCommand(cmd, conn, aSQLWithParameter.SQL.ToString(), aSQLWithParameter.Parameters);  
    154.                     int rows = cmd.ExecuteNonQuery();  
    155.                     cmd.Parameters.Clear();  
    156.                     return rows;  
    157.                 }  
    158.             }  
    159.         }  
    160.   
    161.         /// <summary>  
    162.         /// 執行多條SQL語句,實現數據庫事務。  
    163.         /// </summary>  
    164.         /// <param name="aSQLWithParameterList">參數化的SQL語句結構體對象集合</param>          
    165.         public string ExecuteSqlTran(List<SQLWithParameter> aSQLWithParameterList)  
    166.         {  
    167.             using (DbConnection conn = _DbFactory.CreateConnection())  
    168.             {  
    169.                 conn.ConnectionString = mDBConfig.ConnString;  
    170.                 conn.Open();  
    171.                 DbTransaction fSqlTransaction = conn.BeginTransaction();  
    172.                 try  
    173.                 {  
    174.                     List<DbCommand> fTranCmdList = new List<DbCommand>();  
    175.                     //創建新的CMD  
    176.                     DbCommand fFirstCMD = _DbFactory.CreateCommand();  
    177.                     fFirstCMD.Connection = conn;  
    178.                     fFirstCMD.Transaction = fSqlTransaction;  
    179.                     fTranCmdList.Add(fFirstCMD);  
    180.                     int NowCmdIndex = 0;//當前執行的CMD索引值  
    181.                     int ExecuteCount = 0;//已經執行的CMD次數  
    182.                     StringBuilder fSQL = new StringBuilder();  
    183.                     foreach (SQLWithParameter fSQLWithParameter in aSQLWithParameterList)  
    184.                     {  
    185.                         fSQL.Append(fSQLWithParameter.SQL.ToString() + ";");  
    186.                         fTranCmdList[NowCmdIndex].Parameters.AddRange(fSQLWithParameter.Parameters.ToArray());  
    187.                         if (fTranCmdList[NowCmdIndex].Parameters.Count > 2000)  
    188.                         { //參數達到2000個,執行一次CMD  
    189.                             fTranCmdList[NowCmdIndex].CommandText = fSQL.ToString();  
    190.                             fTranCmdList[NowCmdIndex].ExecuteNonQuery();  
    191.                             DbCommand fNewCMD = _DbFactory.CreateCommand();  
    192.                             fNewCMD.Connection = conn;  
    193.                             fNewCMD.Transaction = fSqlTransaction;  
    194.                             fTranCmdList.Add(fNewCMD);  
    195.                             NowCmdIndex++;  
    196.                             ExecuteCount++;  
    197.                             fSQL.Clear();//清空SQL  
    198.                         }  
    199.                     }  
    200.                     if (ExecuteCount < fTranCmdList.Count)  
    201.                     {//已執行CMD次數小于總CMD數,執行最后一條CMD  
    202.                         fTranCmdList[fTranCmdList.Count - 1].CommandText = fSQL.ToString();  
    203.                         fTranCmdList[fTranCmdList.Count - 1].ExecuteNonQuery();  
    204.                     }  
    205.                     fSqlTransaction.Commit();  
    206.                     return null;  
    207.                 }  
    208.                 catch (Exception ex)  
    209.                 {  
    210.                     fSqlTransaction.Rollback();  
    211.                     StringBuilder fSQL = new StringBuilder();  
    212.                     foreach (SQLWithParameter fSQLWithParameter in aSQLWithParameterList)  
    213.                     {  
    214.                         fSQL.Append(fSQLWithParameter.SQL.ToString() + ";");  
    215.                     }  
    216.                     YFmk.Lib.LocalLog.WriteByDate(fSQL.ToString()+" 錯誤:"+ex.Message, "ORM");  
    217.                     return ex.Message;  
    218.                 }  
    219.             }  
    220.         }  
    221.   
    222.         /// <summary>  
    223.         /// 執行查詢語句,返回DataSet  
    224.         /// </summary>  
    225.         /// <param name="SQLString">查詢語句</param>  
    226.         /// <returns>DataSet</returns>  
    227.         public DataSet Query(string SQLString)  
    228.         {  
    229.             using (DbConnection conn = _DbFactory.CreateConnection())  
    230.             {  
    231.                 conn.ConnectionString = mDBConfig.ConnString;  
    232.                 using (DbCommand cmd = _DbFactory.CreateCommand())  
    233.                 {  
    234.                     PrepareCommand(cmd, conn, SQLString);  
    235.                     using (DbDataAdapter da = _DbFactory.CreateDataAdapter())  
    236.                     {  
    237.                         da.SelectCommand = cmd;  
    238.                         DataSet ds = new DataSet();  
    239.                         try  
    240.                         {  
    241.                             da.Fill(ds, "ds");  
    242.                             cmd.Parameters.Clear();  
    243.                         }  
    244.                         catch (Exception ex)  
    245.                         {  
    246.                               
    247.                         }  
    248.                         return ds;  
    249.                     }  
    250.                 }  
    251.             }  
    252.         }  
    253.   
    254.         /// <summary>  
    255.         /// 執行查詢語句,返回DataSet  
    256.         /// </summary>  
    257.         /// <param name="aSQLWithParameter">查詢語句</param>  
    258.         /// <returns>DataSet</returns>  
    259.         public DataSet Query(SQLWithParameter aSQLWithParameter)  
    260.         {  
    261.             using (DbConnection conn = _DbFactory.CreateConnection())  
    262.             {  
    263.                 conn.ConnectionString = mDBConfig.ConnString;  
    264.                 using (DbCommand cmd = _DbFactory.CreateCommand())  
    265.                 {  
    266.                     PrepareCommand(cmd, conn, aSQLWithParameter.SQL.ToString(), aSQLWithParameter.Parameters);  
    267.                     using (DbDataAdapter da = _DbFactory.CreateDataAdapter())  
    268.                     {  
    269.                         da.SelectCommand = cmd;  
    270.                         DataSet ds = new DataSet();  
    271.                         da.Fill(ds, "ds");  
    272.                         cmd.Parameters.Clear();  
    273.                         return ds;  
    274.                     }  
    275.                 }  
    276.             }  
    277.         }  
    278.         #endregion  
    279.  
    280.         #region 私有函數  
    281.         private void PrepareCommand(DbCommand cmd, DbConnection conn, string cmdText)  
    282.         {  
    283.             if (conn.State != ConnectionState.Open)  
    284.                 conn.Open();  
    285.             cmd.Connection = conn;  
    286.             cmd.CommandText = cmdText;  
    287.         }  
    288.   
    289.         private void PrepareCommand(DbCommand cmd, DbConnection conn, string cmdText, List<DbParameter> cmdParms)  
    290.         {  
    291.             if (conn.State != ConnectionState.Open)  
    292.                 conn.Open();  
    293.             cmd.Connection = conn;  
    294.             cmd.CommandText = cmdText;  
    295.             if (cmdParms != null && cmdParms.Count>0)  
    296.             {  
    297.                 cmd.Parameters.AddRange(cmdParms.ToArray());  
    298.             }  
    299.         }  
    300.         #endregion  

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      主站蜘蛛池模板: 国内精品久久久久久久小说| 欧洲免费一区二区三区视频| 国产二区三区不卡免费| 野外做受三级视频| 亚洲综合欧美色五月俺也去 | 欧美乱妇高清无乱码免费| 久久99亚洲含羞草影院| 18禁网站免费无遮挡无码中文 | 中文字幕国产原创国产| 丰满爆乳在线播放| 亚洲精品国自产拍在线观看| 国偷自产一区二区三区在线视频| 亚洲综合无码精品一区二区三区| 亚洲中文字幕在线二页| 老司机亚洲精品影院| 欧美极品色午夜在线视频| 亚洲AV中文无码乱人伦在线观看| 久女女热精品视频在线观看| 亚洲AV无码成人网站手机观看| 成人国产片视频在线观看| 国产一区二区三区不卡AV| 成人无码特黄特黄AV片在线| 亚洲男人第一无码av网站| 无码熟妇人妻AV在线影片最多| 成人一区二区不卡国产| 国产无套粉嫩白浆在线观看| 国产精品久久福利新婚之夜| 亚洲国产成人久久一区久久| 午夜不卡欧美AAAAAA在线观看| 国产盗摄xxxx视频xxxx| 国产精品一区二区久久不卡| 精品中文人妻中文字幕| 国产在沙发上午睡被强| 老子午夜精品无码| 国产一区二区三区导航| 桃子视频在线播放WWW| 又湿又紧又大又爽A视频国产| 伊人成伊人成综合网222| 亚洲鸥美日韩精品久久| 少妇特殊按摩高潮惨叫无码| 秋霞A级毛片在线看|