网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

ado.net快速学习实践篇(一)

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

前言:这两天重温经典,对ado.net的东西稍微深入的了解了一下,顺便写点代码练练手,全当是复习笔记吧。【本文示例】
一、简单说说ado.net的5大常用对象

既然说ado.net,当然不能免俗地要提到5大常用对象。本文不会对ado.net的5大对象和它们的关系进行过多阐释,不过我们应该对下面这张图的结构有个了解:

关于上图图示中的5大对象,经常做以数据为驱动的mis系统的童鞋应该不会陌生。本文一笔带过。下面我们一步一步实现以ado.net为核心的数据访问程序。

注意:下面的示例代码和demo是楼猪本周六和周日两天时间实现的,未经详细测试,可能有重大bug,下载学习使用的童鞋务必注意】

二、数据访问持久化层
1、IDbOperation接口

  1. using System.Collections.Generic; 
  2. using System.Data; 
  3. using System.Data.Common; 
  4.  
  5. namespace AdoNetDataAccess.Core.Contract 
  6.     public interface IDbOperation 
  7.     { 
  8.         DbCommand CreateDbCommd(DbConnection sqlConn, DbTransaction transaction, string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  9.  
  10.         DbParameter CreateDbPrameter(string paramName, object paramValue); 
  11.  
  12.         DbDataReader ExecuteReader(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  13.  
  14.         DataTable FillDataTable(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  15.  
  16.         DataSet FillDataSet(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  17.  
  18.         object ExecuteScalar(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  19.  
  20.         int ExecuteNonQuery(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  21.  
  22.         /// <summary> 
  23.         /// 批量插入 
  24.         /// </summary> 
  25.         /// <param name="tableName">表名称</param> 
  26.         /// <param name="dt">组装好的要批量导入的datatable</param> 
  27.         /// <returns></returns> 
  28.         bool ExecuteBatchInsert(string tableName, int batchSize, int copyTimeout, DataTable dt); 
  29.  
  30.         void OpenConnection(); 
  31.  
  32.         void CloseConnection(); 
  33.     } 

上面的接口包括增删改查,批量插入以及数据库连接对象的连接和关闭等常用操作,您可以根据命名和参数轻松理解函数的含义。根据楼猪的开发经验,对于平时的数据库操作,上述方法差不多够用了。当然您也可以按照自己需要,重写组织添加其他函数。

2、针对一种数据源的数据操作实现

底层的数据操作接口定义好后,就要针对一种数据源,具体实现上述的数据操作。这里楼猪选择了Sql Server。我们也可以实现其他数据源的数据访问操作,按照配置,利用抽象工厂动态反射选择是哪一种数据源的实现。这里按下不表,有心的童鞋自己可以动手一试。下面是具体的实现:

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Data; 
  4. using System.Data.Common; 
  5. using System.Data.SqlClient; 
  6. using System.Transactions; 
  7.  
  8. namespace AdoNetDataAccess.Core.Implement 
  9.     using AdoNetDataAccess.Core.Contract; 
  10.  
  11.     public class SqlServer : IDbOperation, IDisposable 
  12.     { 
  13.         private int cmdTimeOut = 60; 
  14.         private DbConnection sqlConn = null
  15.         private DbCommand cmd = null
  16.  
  17.         private SqlServer() 
  18.         { 
  19.  
  20.         } 
  21.  
  22.         public SqlServer(string sqlConStr) 
  23.         { 
  24.             sqlConn = new SqlConnection(sqlConStr); 
  25.             cmdTimeOut = sqlConn.ConnectionTimeout; 
  26.         } 
  27.  
  28.         public SqlServer(string sqlConStr, int timeOut) 
  29.         { 
  30.             sqlConn = new SqlConnection(sqlConStr); 
  31.             if (timeOut < 0) 
  32.             { 
  33.                 timeOut = sqlConn.ConnectionTimeout; 
  34.             } 
  35.             cmdTimeOut = timeOut; 
  36.         } 
  37.  
  38.         #region contract method 
  39.  
  40.         public DbCommand CreateDbCommd(DbConnection sqlConn, DbTransaction transaction, string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  41.         { 
  42.             DbCommand cmd = new SqlCommand(); 
  43.             cmd.Connection = sqlConn; 
  44.             cmd.CommandText = sqlStr; 
  45.             cmd.CommandType = cmdType; 
  46.             if (transaction != null
  47.             { 
  48.                 cmd.Transaction = transaction; 
  49.             } 
  50.             if (listParams != null && listParams.Count > 0) 
  51.             { 
  52.                 cmd.Parameters.AddRange(listParams.ToArray()); 
  53.             } 
  54.             cmd.CommandTimeout = cmdTimeOut; 
  55.             OpenConnection(); 
  56.             return cmd; 
  57.         } 
  58.  
  59.         public DbParameter CreateDbPrameter(string paramName, object paramValue) 
  60.         { 
  61.             SqlParameter sp = new SqlParameter(paramName, paramValue); 
  62.             return sp; 
  63.         } 
  64.  
  65.         public DbDataReader ExecuteReader(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  66.         { 
  67.             DbDataReader rdr = null
  68.             try 
  69.             { 
  70.                 OpenConnection(); 
  71.                 cmd = CreateDbCommd(sqlConn, null, sqlStr, cmdType, listParams); 
  72.                 rdr = cmd.ExecuteReader(); 
  73.             } 
  74.             catch (Exception ex) 
  75.             { 
  76.                 throw ex; 
  77.             } 
  78.             return rdr; 
  79.         } 
  80.  
  81.         public DataTable FillDataTable(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  82.         { 
  83.             OpenConnection(); 
  84.             DbTransaction trans = sqlConn.BeginTransaction(); 
  85.             DbCommand cmd = CreateDbCommd(sqlConn, trans, sqlStr, cmdType, listParams); 
  86.             SqlDataAdapter sqlDataAdpter = new SqlDataAdapter(cmd as SqlCommand); 
  87.             DataTable dt = new DataTable(); 
  88.             try 
  89.             { 
  90.                 sqlDataAdpter.Fill(dt); 
  91.                 trans.Commit(); 
  92.             } 
  93.             catch (Exception e) 
  94.             { 
  95.                 trans.Rollback(); 
  96.                 throw new Exception("执行数据库操作失败, sql: " + sqlStr, e); 
  97.             } 
  98.             finally 
  99.             { 
  100.                 sqlDataAdpter.Dispose(); 
  101.                 cmd.Dispose(); 
  102.                 trans.Dispose(); 
  103.                 CloseConnection(); 
  104.             } 
  105.             return dt; 
  106.         } 
  107.  
  108.         public DataSet FillDataSet(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  109.         { 
  110.             OpenConnection(); 
  111.             DbTransaction trans = sqlConn.BeginTransaction(); 
  112.             DbCommand cmd = CreateDbCommd(sqlConn, trans, sqlStr, cmdType, listParams); 
  113.             SqlDataAdapter sqlDataAdpter = new SqlDataAdapter(cmd as SqlCommand); 
  114.             DataSet ds = new DataSet(); 
  115.             try 
  116.             { 
  117.                 sqlDataAdpter.Fill(ds); 
  118.                 trans.Commit(); 
  119.             } 
  120.             catch (Exception e) 
  121.             { 
  122.                 trans.Rollback(); 
  123.                 throw new Exception("执行数据库操作失败, sql: " + sqlStr, e); 
  124.             } 
  125.             finally 
  126.             { 
  127.                 sqlDataAdpter.Dispose(); 
  128.                 cmd.Dispose(); 
  129.                 trans.Dispose(); 
  130.                 CloseConnection(); 
  131.             } 
  132.             return ds; 
  133.         } 
  134.  
  135.         public object ExecuteScalar(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  136.         { 
  137.             object result = null
  138.             OpenConnection(); 
  139.             DbTransaction trans = sqlConn.BeginTransaction(); 
  140.             try 
  141.             { 
  142.                 cmd = CreateDbCommd(sqlConn, trans, sqlStr, cmdType, listParams); 
  143.                 result = cmd.ExecuteScalar(); 
  144.                 trans.Commit(); 
  145.             } 
  146.             catch (Exception e) 
  147.             { 
  148.                 trans.Rollback(); 
  149.                 throw new Exception("执行数据库操作失败, sql: " + sqlStr, e); 
  150.             } 
  151.             finally 
  152.             { 
  153.                 trans.Dispose(); 
  154.                 CloseConnection(); 
  155.             } 
  156.             return result; 
  157.         } 
  158.  
  159.         public int ExecuteNonQuery(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  160.         { 
  161.             int result = -1; 
  162.             OpenConnection(); 
  163.             DbTransaction trans = sqlConn.BeginTransaction(); 
  164.             try 
  165.             { 
  166.                 cmd = CreateDbCommd(sqlConn, trans, sqlStr, cmdType, listParams); 
  167.                 result = cmd.ExecuteNonQuery(); 
  168.                 trans.Commit(); 
  169.             } 
  170.             catch (Exception e) 
  171.             { 
  172.                 trans.Rollback(); 
  173.                 throw new Exception("执行数据库操作失败, sql: " + sqlStr, e); 
  174.             } 
  175.             finally 
  176.             { 
  177.                 trans.Dispose(); 
  178.                 CloseConnection(); 
  179.             } 
  180.             return result; 
  181.         } 
  182.  
  183.         /// <summary> 
  184.         /// 批量插入 
  185.         /// </summary> 
  186.         /// <param name="tableName"></param> 
  187.         /// <param name="batchSize"></param> 
  188.         /// <param name="copyTimeout"></param> 
  189.         /// <param name="dt"></param> 
  190.         /// <returns></returns> 
  191.         public bool ExecuteBatchInsert(string tableName, int batchSize, int copyTimeout, DataTable dt) 
  192.         { 
  193.             bool flag = false
  194.             try 
  195.             { 
  196.                 using (TransactionScope scope = new TransactionScope()) 
  197.                 { 
  198.                     OpenConnection(); 
  199.                     using (SqlBulkCopy sbc = new SqlBulkCopy(sqlConn as SqlConnection)) 
  200.                     { 
  201.                         //服务器上目标表的名称 
  202.                         sbc.DestinationTableName = tableName; 
  203.                         sbc.BatchSize = batchSize; 
  204.                         sbc.BulkCopyTimeout = copyTimeout; 
  205.                         for (int i = 0; i < dt.Columns.Count; i++) 
  206.                         { 
  207.                             //列映射定义数据源中的列和目标表中的列之间的关系 
  208.                             sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 
  209.                         } 
  210.                         sbc.WriteToServer(dt); 
  211.                         flag = true
  212.                         scope.Complete();//有效的事务 
  213.                     } 
  214.                 } 
  215.             } 
  216.             catch (Exception ex) 
  217.             { 
  218.                 throw ex; 
  219.             } 
  220.             return flag; 
  221.         } 
  222.  
  223.         public void OpenConnection() 
  224.         { 
  225.             if (sqlConn.State == ConnectionState.Broken || sqlConn.State == ConnectionState.Closed) 
  226.                 sqlConn.Open(); 
  227.         } 
  228.  
  229.         public void CloseConnection() 
  230.         { 
  231.             sqlConn.Close(); 
  232.         } 
  233.  
  234.         #endregion 
  235.  
  236.         #region dispose method 
  237.  
  238.         /// <summary> 
  239.         /// dispose接口方法 
  240.         /// </summary> 
  241.         public void Dispose() 
  242.         { 
  243.  
  244.         } 
  245.  
  246.         #endregion 
  247.     } 

到这里,我们实现了SqlServer类里的方法,对Ms SqlServer数据库我们就已经可以进行简单的基础的CRUD操作了。

三、简单直观的对象实体转换

在第二步中,我们已经实现了简单的数据CRUD操作。根据楼猪使用ORM的经验和习惯,我们也应该对一些查询结果进行转换,因为以类的组织方式比直接呈现ado.net对象更容易让人接受,效率高低反在其次。下面利用常见的反射原理,简单实现一个对象实体转换器ModelConverter类:

  1. using System; 
  2. using System.Collections; 
  3. using System.Collections.Generic; 
  4. using System.Data; 
  5. using System.Data.Common; 
  6. using System.Reflection; 
  7. using System.Threading; 
  8.  
  9. namespace AdoNetDataAccess.Core.Obj2Model 
  10.     using AdoNetDataAccess.Core.Contract; 
  11.  
  12.     public sealed class ModelConverter 
  13.     { 
  14.         private static readonly object objSync = new object(); 
  15.  
  16.         #region query for list 
  17.  
  18.         /// <summary> 
  19.         /// 查询数据表项并转换为对应实体 
  20.         /// </summary> 
  21.         /// <typeparam name="T"></typeparam> 
  22.         /// <param name="objType"></param> 
  23.         /// <param name="rdr"></param> 
  24.         /// <returns></returns> 
  25.         public static IList<T> QueryForList<T>(string sqlStr, CommandType cmdType, List<DbParameter> listParams, Type objType, IDbOperation dbOperation) 
  26.             where T : classnew() 
  27.         { 
  28.             IDataReader rdr = dbOperation.ExecuteReader(sqlStr, cmdType, listParams); 
  29.             IList<T> listModels = new List<T>(); 
  30.             try 
  31.             { 
  32.                 Monitor.Enter(objSync); 
  33.                 Hashtable ht = CreateHashColumnName(rdr); 
  34.                 while (rdr.Read()) 
  35.                 { 
  36.                     Object obj = Activator.CreateInstance(objType); 
  37.                     PropertyInfo properties = objType.GetProperties(); 
  38.                     foreach (PropertyInfo propInfo in properties) 
  39.                     { 
  40.                         string columnName = propInfo.Name.ToUpper(); 
  41.                         if (ht.ContainsKey(columnName) == false
  42.                         { 
  43.                             continue
  44.                         } 
  45.                         int index = rdr.GetOrdinal(propInfo.Name); 
  46.                         object columnValue = rdr.GetValue(index); 
  47.                         if (columnValue != System.DBNull.Value) 
  48.                         { 
  49.                             SetValue(propInfo, obj, columnValue); 
  50.                         } 
  51.                     } 
  52.                     T model = default(T); 
  53.                     model = obj as T; 
  54.                     listModels.Add(model); 
  55.                 } 
  56.             } 
  57.             finally 
  58.             { 
  59.                 rdr.Close(); 
  60.                 rdr.Dispose(); 
  61.                 Monitor.Exit(objSync); 
  62.             } 
  63.             return listModels; 
  64.         } 
  65.  
  66.         #endregion 
  67.  
  68.         #region query for dictionary 
  69.  
  70.         /// <summary> 
  71.         /// 查询数据表项并转换为对应实体 
  72.         /// </summary> 
  73.         /// <typeparam name="K"></typeparam> 
  74.         /// <typeparam name="T"></typeparam> 
  75.         /// <param name="key">字典对应key列名</param> 
  76.         /// <param name="objType"></param> 
  77.         /// <param name="rdr"></param> 
  78.         /// <returns></returns> 
  79.         public static IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr, CommandType cmdType, List<DbParameter> listParams, Type objType, IDbOperation dbOperation) 
  80.             where T : classnew() 
  81.         { 
  82.             IDataReader rdr = dbOperation.ExecuteReader(sqlStr, cmdType, listParams); 
  83.             IDictionary<K, T> dictModels = new Dictionary<K, T>(); 
  84.             try 
  85.             { 
  86.                 Monitor.Enter(objSync); 
  87.                 Hashtable ht = CreateHashColumnName(rdr); 
  88.                 while (rdr.Read()) 
  89.                 { 
  90.                     Object obj = Activator.CreateInstance(objType); 
  91.                     PropertyInfo properties = objType.GetProperties(); 
  92.                     object dictKey = null
  93.                     foreach (PropertyInfo propInfo in properties) 
  94.                     { 
  95.                         string columnName = propInfo.Name.ToUpper(); 
  96.                         if (ht.ContainsKey(columnName) == false
  97.                         { 
  98.                             continue
  99.                         } 
  100.                         int index = rdr.GetOrdinal(propInfo.Name); 
  101.                         object columnValue = rdr.GetValue(index); 
  102.                         if (columnValue != System.DBNull.Value) 
  103.                         { 
  104.                             SetValue(propInfo, obj, columnValue); 
  105.                             if (string.Compare(columnName, key.ToUpper()) == 0) 
  106.                             { 
  107.                                 dictKey = columnValue; 
  108.                             } 
  109.                         } 
  110.                     } 
  111.                     T model = default(T); 
  112.                     model = obj as T; 
  113.                     K objKey = (K)dictKey; 
  114.                     dictModels.Add(objKey, model); 
  115.                 } 
  116.             } 
  117.             finally 
  118.             { 
  119.                 rdr.Close(); 
  120.                 rdr.Dispose(); 
  121.                 Monitor.Exit(objSync); 
  122.             } 
  123.             return dictModels; 
  124.         } 
  125.  
  126.         #endregion 
  127.  
  128.         #region internal util 
  129.  
  130.         private static Hashtable CreateHashColumnName(IDataReader rdr) 
  131.         { 
  132.             int len = rdr.FieldCount; 
  133.             Hashtable ht = new Hashtable(len); 
  134.             for (int i = 0; i < len; i++) 
  135.             { 
  136.                 string columnName = rdr.GetName(i).ToUpper(); //不区分大小写 
  137.                 string columnRealName = rdr.GetName(i); 
  138.                 if (ht.ContainsKey(columnName) == false
  139.                 { 
  140.                     ht.Add(columnName, columnRealName); 
  141.                 } 
  142.             } 
  143.             return ht; 
  144.         } 
  145.  
  146.         private static void SetValue(PropertyInfo propInfo, Object obj, object objValue) 
  147.         { 
  148.             try 
  149.             { 
  150.                 propInfo.SetValue(obj, objValue, null); 
  151.             } 
  152.             catch 
  153.             { 
  154.                 object realValue = null
  155.                 try 
  156.                 { 
  157.                     realValue = Convert.ChangeType(objValue, propInfo.PropertyType); 
  158.                     propInfo.SetValue(obj, realValue, null); 
  159.                 } 
  160.                 catch (Exception ex) 
  161.                 { 
  162.                     string err = ex.Message; 
  163.                     //throw ex; //在数据库数据有不符合规范的情况下应该及时抛出异常 
  164.                 } 
  165.             } 
  166.         } 
  167.  
  168.         #endregion 
  169.     } 

到这里,简单的数据访问持久化层就实现了。下面模仿楼猪使用的IBatis.net,写个伪SqlMapper,改善一下调用形式,丰富一下调用方法,让方法辨识度更高。

四、实现伪SqlMapper

1、BaseMapper类

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Data; 
  4. using System.Data.Common; 
  5. using System.Data.SqlClient; 
  6.  
  7. namespace AdoNetDataAccess.Mapper 
  8.     using AdoNetDataAccess.Core.Contract; 
  9.  
  10.     public abstract class BaseMapper 
  11.     { 
  12.         public IDbOperation CurrentDbOperation; 
  13.  
  14.         #region query for list 
  15.  
  16.         public abstract IList<T> QueryForList<T>(string sqlStr) 
  17.   where T : classnew(); 
  18.  
  19.         public abstract IList<T> QueryForList<T>(string sqlStr, Type objType) 
  20. where T : classnew(); 
  21.  
  22.         public abstract IList<T> QueryForList<T>(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  23.        where T : classnew(); 
  24.  
  25.         public abstract IList<T> QueryForList<T>(string sqlStr, CommandType cmdType, List<DbParameter> listParams, Type objType) 
  26.        where T : classnew(); 
  27.  
  28.  
  29.         #endregion 
  30.  
  31.         #region query for dictionary 
  32.  
  33.         public abstract IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr) 
  34.             where T : classnew(); 
  35.  
  36.         public abstract IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr, Type objType) 
  37.     where T : classnew(); 
  38.  
  39.         public abstract IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr, CommandType cmdType, Type objType) 
  40.             where T : classnew(); 
  41.  
  42.         public abstract IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr, CommandType cmdType, List<DbParameter> listParams, Type objType) 
  43.                     where T : classnew(); 
  44.  
  45.         #endregion 
  46.  
  47.         #region dataset datatable 
  48.  
  49.         public abstract DataTable FillDataTable(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  50.  
  51.         public abstract DataSet FillDataSet(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  52.  
  53.         #endregion 
  54.  
  55.         #region ExecuteScalar 
  56.  
  57.         public abstract object ExecuteScalar(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  58.  
  59.         #endregion 
  60.  
  61.         #region insert 
  62.  
  63.         public abstract int Insert(string sqlStr); 
  64.  
  65.         public abstract int Insert(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  66.  
  67.         public abstract bool BatchInsert(string tableName, int batchSize, int copyTimeout, DataTable dt); 
  68.  
  69.         #endregion 
  70.  
  71.         #region delete 
  72.  
  73.         public abstract int Delete(string sqlStr); 
  74.  
  75.         public abstract int Delete(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  76.  
  77.         #endregion 
  78.  
  79.         #region update 
  80.  
  81.         public abstract int Update(string sqlStr); 
  82.  
  83.         public abstract int Update(string sqlStr, CommandType cmdType, List<DbParameter> listParams); 
  84.  
  85.         #endregion 
  86.  
  87.     } 
  88.  

上面代码中的方法您是不是很熟悉呢? 呵呵,使用IBatis.net 的童鞋应该会和楼猪产生更多的共鸣。

2、SqlMapper类

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Data; 
  4. using System.Data.Common; 
  5.  
  6. namespace AdoNetDataAccess.Mapper 
  7.     using AdoNetDataAccess.Core.Contract; 
  8.     using AdoNetDataAccess.Core.Obj2Model; 
  9.  
  10.     public class SqlMapper : BaseMapper 
  11.     { 
  12.         private SqlMapper() 
  13.         { 
  14.  
  15.         } 
  16.  
  17.         public SqlMapper(IDbOperation dbOperation) 
  18.         { 
  19.             this.CurrentDbOperation = dbOperation; 
  20.         } 
  21.  
  22.         #region query for list 
  23.  
  24.         public override IList<T> QueryForList<T>(string sqlStr) 
  25.         { 
  26.             return QueryForList<T>(sqlStr, CommandType.Text, nulltypeof(T)); 
  27.         } 
  28.  
  29.         public override IList<T> QueryForList<T>(string sqlStr, Type objType) 
  30.         { 
  31.             return QueryForList<T>(sqlStr, CommandType.Text, null, objType); 
  32.         } 
  33.  
  34.         public override IList<T> QueryForList<T>(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  35.         { 
  36.             return QueryForList<T>(sqlStr, cmdType, listParams, typeof(T)); 
  37.         } 
  38.  
  39.         public override IList<T> QueryForList<T>(string sqlStr, CommandType cmdType, List<DbParameter> listParams, Type objType) 
  40.         { 
  41.             return ModelConverter.QueryForList<T>(sqlStr, cmdType, listParams, objType, this.CurrentDbOperation); 
  42.         } 
  43.  
  44.         #endregion 
  45.  
  46.         #region query for dictionary 
  47.  
  48.         public override IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr) 
  49.         { 
  50.             return QueryForDictionary<K, T>(key, sqlStr, CommandType.Text, nulltypeof(T)); 
  51.         } 
  52.  
  53.         public override IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr, Type objType) 
  54.         { 
  55.             return QueryForDictionary<K, T>(key, sqlStr, CommandType.Text, null, objType); 
  56.         } 
  57.  
  58.         public override IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr, CommandType cmdType, Type objType) 
  59.         { 
  60.             return QueryForDictionary<K, T>(key, sqlStr, cmdType, null, objType); 
  61.         } 
  62.  
  63.         public override IDictionary<K, T> QueryForDictionary<K, T>(string key, string sqlStr, CommandType cmdType, List<DbParameter> listParams, Type objType) 
  64.         { 
  65.             return ModelConverter.QueryForDictionary<K, T>(key, sqlStr, cmdType, listParams, objType, this.CurrentDbOperation); 
  66.         } 
  67.  
  68.         #endregion 
  69.  
  70.         #region dataset datatable 
  71.  
  72.         public override DataTable FillDataTable(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  73.         { 
  74.             return this.CurrentDbOperation.FillDataTable(sqlStr, cmdType, listParams); 
  75.         } 
  76.  
  77.         public override DataSet FillDataSet(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  78.         { 
  79.             return this.CurrentDbOperation.FillDataSet(sqlStr, cmdType, listParams); 
  80.         } 
  81.  
  82.         #endregion 
  83.  
  84.         #region ExecuteScalar 
  85.  
  86.         public override object ExecuteScalar(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  87.         { 
  88.             return this.CurrentDbOperation.ExecuteScalar(sqlStr, cmdType, listParams); 
  89.         } 
  90.  
  91.         #endregion 
  92.  
  93.         #region insert 
  94.  
  95.         public override int Insert(string sqlStr) 
  96.         { 
  97.             object obj = ExecuteScalar(sqlStr, CommandType.Text, null); 
  98.             int id = obj == null ? 0 : int.Parse(obj.ToString()); 
  99.             return id; 
  100.         } 
  101.  
  102.         public override int Insert(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  103.         { 
  104.             object obj = ExecuteScalar(sqlStr, cmdType, listParams); 
  105.             int id = obj == null ? 0 : int.Parse(obj.ToString()); 
  106.             return id; 
  107.         } 
  108.  
  109.         /// <summary> 
  110.         /// 批量插入 
  111.         /// </summary> 
  112.         /// <param name="tableName"></param> 
  113.         /// <param name="batchSize"></param> 
  114.         /// <param name="copyTimeout"></param> 
  115.         /// <param name="dt"></param> 
  116.         /// <returns></returns> 
  117.         public override bool BatchInsert(string tableName, int batchSize, int copyTimeout, DataTable dt) 
  118.         { 
  119.             return this.CurrentDbOperation.ExecuteBatchInsert(tableName, batchSize, copyTimeout, dt); 
  120.         } 
  121.  
  122.         #endregion 
  123.  
  124.         #region delete 
  125.  
  126.         public override int Delete(string sqlStr) 
  127.         { 
  128.             return CommitSql(sqlStr, CommandType.Text, null); 
  129.         } 
  130.  
  131.         public override int Delete(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  132.         { 
  133.             return CommitSql(sqlStr, cmdType, listParams); 
  134.         } 
  135.  
  136.         #endregion 
  137.  
  138.         #region update 
  139.  
  140.         public override int Update(string sqlStr) 
  141.         { 
  142.             return CommitSql(sqlStr, CommandType.Text, null); 
  143.         } 
  144.  
  145.         public override int Update(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  146.         { 
  147.             return CommitSql(sqlStr, cmdType, listParams); 
  148.         } 
  149.  
  150.         #endregion 
  151.  
  152.         #region commit and execute sql 
  153.  
  154.         private int CommitSql(string sqlStr, CommandType cmdType, List<DbParameter> listParams) 
  155.         { 
  156.             return this.CurrentDbOperation.ExecuteNonQuery(sqlStr, cmdType, listParams); 
  157.         } 
  158.  
  159.         #endregion 
  160.  
  161.         #region  dbparameter 
  162.  
  163.         public DbParameter CreateParameter(string paraName, object paramValue) 
  164.         { 
  165.             return this.CurrentDbOperation.CreateDbPrameter(paraName, paramValue); 
  166.         } 
  167.  
  168.         public List<DbParameter> CreateParameterList(string paraNames, object paramValues) 
  169.         { 
  170.             List<DbParameter> listParams = new List<DbParameter>(); 
  171.             try 
  172.             { 
  173.                 if (paraNames.Length != paramValues.Length) 
  174.                 { 
  175.                     throw new Exception("Param name and value is not equal."); 
  176.                 } 
  177.                 for (int i = 0; i < paraNames.Length; i++) 
  178.                 { 
  179.                     DbParameter param = CreateParameter(paraNames[i], paramValues[i]); 
  180.                     listParams.Add(param); 
  181.                 } 
  182.             } 
  183.             catch (Exception ex) 
  184.             { 
  185.                 throw ex; 
  186.             } 
  187.             return listParams; 
  188.         } 
  189.  
  190.         #endregion 
  191.  
  192.     } 
  193.  

上面的方法丰富实现了CRUD的常见操作,其实主要还是调用了IDbOperation接口和方法。
未完,待续。

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师