知识大全 ado.net快速上手实践篇(一)
Posted 操作
篇首语:才华是刀刃,辛苦是磨刀石。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ado.net快速上手实践篇(一)相关的知识,希望对你有一定的参考价值。
这两天重温经典 对的东西稍微深入的了解了一下 顺便写点代码练练手 全当是复习笔记吧 一 简单说说的 大常用对象 既然说 当然不能免俗地要提到 大常用对象 本文不会对的 大对象和它们的关系进行过多阐释 不过我们应该对下面这张图的结构有个了解关于上图图示中的 大对象 经常做以数据为驱动的mis系统的童鞋应该不会陌生 本文一笔带过 下面我们一步一步实现以为核心的数据访问程序 二 数据访问持久化层 IDbOperation接口 代码 using System Collections Generic; using System Data; using System Data Common; namespace AdoNetDataaccess Core Contract public interface IDbOperation DbCommand CreateDbCommd(DbConnection sqlConn DbTransaction transaction string sqlStr CommandType cmdType List<DbParameter> listParams); DbParameter CreateDbPRameter(string paramName object paramValue); DbDataReader ExecuteReader(string sqlStr CommandType cmdType List<DbParameter> listParams); DataTable FillDataTable(string sqlStr CommandType cmdType List<DbParameter> listParams); DataSet FillDataSet(string sqlStr CommandType cmdType List<DbParameter> listParams); object ExecuteScalar(string sqlStr CommandType cmdType List<DbParameter> listParams); int ExecuteNonQuery(string sqlStr CommandType cmdType List<DbParameter> listParams); /// <summary> /// 批量插入 /// </summary> /// <param name= tableName >表名称</param> /// <param name= dt >组装好的要批量导入的datatable</param> /// <returns></returns> bool ExecuteBatchInsert(string tableName int batchSize int copyTimeout DataTable dt); void OpenConnection(); void CloseConnection(); 上面的接口包括增删改查 批量插入以及数据库连接对象的连接和关闭等常用操作 您可以根据命名和参数轻松理解函数的含义 根据楼猪的开发经验 对于平时的数据库操作 上述方法差不多够用了 当然您也可以按照自己需要 重写组织添加其他函数 针对一种数据源的数据操作实现 底层的数据操作接口定义好后 就要针对一种数据源 具体实现上述的数据操作 这里楼猪选择了Sql Server 我们也可以实现其他数据源的数据访问操作 按照配置 利用抽象工厂动态反射选择是哪一种数据源的实现 这里按下不表 有心的童鞋自己可以动手一试 下面是具体的实现 代码 using System; using System Collections Generic; using System Data; using System Data Common; using System Data SqlClient; using System Transactions; namespace AdoNetDataAccess Core Implement using AdoNetDataAccess Core Contract; public class SqlServer : IDbOperation IDisposable private int cmdTimeOut = ; private DbConnection sqlConn = null; private DbCommand cmd = null; private SqlServer() public SqlServer(string sqlConStr) sqlConn = new SqlConnection(sqlConStr); cmdTimeOut = sqlConn ConnectionTimeout; public SqlServer(string sqlConStr int timeOut) sqlConn = new SqlConnection(sqlConStr); if (timeOut < ) timeOut = sqlConn ConnectionTimeout; cmdTimeOut = timeOut; #region contract method public DbCommand CreateDbCommd(DbConnection sqlConn DbTransaction transaction string sqlStr CommandType cmdType List<DbParameter> listParams) DbCommand cmd = new SqlCommand(); cmd Connection = sqlConn; cmd CommandText = sqlStr; cmd CommandType = cmdType; if (transaction != null) cmd Transaction = transaction; if (listParams != null && listParams Count > ) cmd Parameters AddRange(listParams ToArray()); cmd CommandTimeout = cmdTimeOut; OpenConnection(); return cmd; public DbParameter CreateDbPrameter(string paramName object paramValue) SqlParameter sp = new SqlParameter(paramName paramValue); return sp; public DbDataReader ExecuteReader(string sqlStr CommandType cmdType List<DbParameter> listParams) DbDataReader rdr = null; try OpenConnection(); cmd = CreateDbCommd(sqlConn null sqlStr cmdType listParams); rdr = cmd ExecuteReader(); catch (Exception ex) throw ex; return rdr; public DataTable FillDataTable(string sqlStr CommandType cmdType List<DbParameter> listParams) OpenConnection(); DbTransaction trans = sqlConn BeginTransaction(); DbCommand cmd = CreateDbCommd(sqlConn trans sqlStr cmdType listParams); SqlDataAdapter sqlDataAdpter = new SqlDataAdapter(cmd as SqlCommand); DataTable dt = new DataTable(); try sqlDataAdpter Fill(dt); trans Commit(); catch (Exception e) trans Rollback(); throw new Exception( 执行数据库操作失败 sql: + sqlStr e); finally sqlDataAdpter Dispose(); cmd Dispose(); trans Dispose(); CloseConnection(); return dt; public DataSet FillDataSet(string sqlStr CommandType cmdType List<DbParameter> listParams) OpenConnection(); DbTransaction trans = sqlConn BeginTransaction(); DbCommand cmd = CreateDbCommd(sqlConn trans sqlStr cmdType listParams); SqlDataAdapter sqlDataAdpter = new SqlDataAdapter(cmd as SqlCommand); DataSet ds = new DataSet(); try sqlDataAdpter Fill(ds); trans Commit(); catch (Exception e) trans Rollback(); throw new Exception( 执行数据库操作失败 sql: + sqlStr e); finally sqlDataAdpter Dispose(); cmd Dispose(); trans Dispose(); CloseConnection(); return ds; public object ExecuteScalar(string sqlStr CommandType cmdType List<DbParameter> listParams) object result = null; OpenConnection(); DbTransaction trans = sqlConn BeginTransaction(); try cmd = CreateDbCommd(sqlConn trans sqlStr cmdType listParams); result = cmd ExecuteScalar(); trans Commit(); catch (Exception e) trans Rollback(); throw new Exception( 执行数据库操作失败 sql: + sqlStr e); finally trans Dispose(); CloseConnection(); return result; public int ExecuteNonQuery(string sqlStr CommandType cmdType List<DbParameter> listParams) int result = ; OpenConnection(); DbTransaction trans = sqlConn BeginTransaction(); try cmd = CreateDbCommd(sqlConn trans sqlStr cmdType listParams); result = cmd ExecuteNonQuery(); trans Commit(); catch (Exception e) trans Rollback(); throw new Exception( 执行数据库操作失败 sql: + sqlStr e); finally trans Dispose(); CloseConnection(); return result; /// <summary> /// 批量插入 /// </summary> /// <param name= tableName ></param> /// <param name= batchSize ></param> /// <param name= copyTimeout ></param> /// <param name= dt ></param> /// <returns></returns> public bool ExecuteBatchInsert(string tableName int batchSize int copyTimeout DataTable dt) bool flag = false; try using (TransactionScope scope = new TransactionScope()) OpenConnection(); using (SqlBulkCopy sbc = new SqlBulkCopy(sqlConn as SqlConnection)) //服务器上目标表的名称 sbc DestinationTableName = tableName; sbc BatchSize = batchSize; sbc BulkCopyTimeout = copyTimeout; for (int i = ; i < dt Columns Count; i++) //列映射定义数据源中的列和目标表中的列之间的关系 sbc ColumnMappings Add(dt Columns[i] ColumnName dt Columns[i] ColumnName); sbc WriteToServer(dt); flag = true; scope Complete();//有效的事务 catch (Exception ex) throw ex; return flag; public void OpenConnection() if (sqlConn State == ConnectionState Broken || sqlConn State == ConnectionState Closed) sqlConn Open(); public void CloseConnection() sqlConn Close(); #endregion #region dispose method /// <summary> /// dispose接口方法 /// </summary> public void Dispose() #endregion 到这里 我们实现了SqlServer类里的方法 对Ms SqlServer数据库我们就已经可以进行简单的基础的CRUD操作了 三 简单直观的对象实体转换 在第二步中 我们已经实现了简单的数据CRUD操作 根据楼猪使用ORM的经验和习惯 我们也应该对一些查询结果进行转换 因为以类的组织方式比直接呈现对象更容易让人接受 效率高低反在其次 下面利用常见的反射原理 简单实现一个对象实体转换器ModelConverter类 代码 using System; using System Collections; using System Collections Generic; using System Data; using System Data Common; using System Reflection; using System Threading; namespace AdoNetDataAccess Core Obj Model using AdoNetDataAccess Core Contract; public sealed class ModelConverter private static readonly object objSync = new object(); #region query for list /// <summary> /// 查询数据表项并转换为对应实体 /// </summary> /// <typeparam name= T ></typeparam> /// <param name= objType ></param> /// <param name= rdr ></param> /// <returns></returns> public static IList<T> QueryForList<T>(string sqlStr CommandType cmdType List<DbParameter> listParams Type objType IDbOperation dbOperation) where T : class new() IDataReader rdr = dbOperation ExecuteReader(sqlStr cmdType listParams); IList<T> listModels = new List<T>(); try Monitor Enter(objSync); Hashtable ht = CreateHashColumnName(rdr); while (rdr Read()) Object obj = Activator CreateInstance(objType); PropertyInfo[] properties = objType GetProperties(); foreach (PropertyInfo propInfo in properties) string columnName = propInfo Name ToUpper(); if (ht ContainsKey(columnName) == false) continue; int index = rdr GetOrdinal(propInfo Name); object columnValue = rdr GetValue(index); if (columnValue != System DBNull Value) SetValue(propInfo obj columnValue); T model = default(T); model = obj as T; listModels Add(model); finally rdr Close(); rdr Dispose(); Monitor Exit(objSync); return listModels; #endregion #region query for dictionary /// <summary> /// 查询数据表项并转换为对应实体 /// </summary> /// <typeparam name= K ></typeparam> /// <typeparam name= T ></typeparam> /// <param name= key >字典对应key列名</param> /// <param name= objType ></param> /// <param name= rdr ></param> /// <returns></returns> public static IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr CommandType cmdType List<DbParameter> listParams Type objType IDbOperation dbOperation) where T : class new() IDataReader rdr = dbOperation ExecuteReader(sqlStr cmdType listParams); IDictionary<K T> dictModels = new Dictionary<K T>(); try Monitor Enter(objSync); Hashtable ht = CreateHashColumnName(rdr); while (rdr Read()) Object obj = Activator CreateInstance(objType); PropertyInfo[] properties = objType GetProperties(); object dictKey = null; foreach (PropertyInfo propInfo in properties) string columnName = propInfo Name ToUpper(); if (ht ContainsKey(columnName) == false) continue; int index = rdr GetOrdinal(propInfo Name); object columnValue = rdr GetValue(index); if (columnValue != System DBNull Value) SetValue(propInfo obj columnValue); if (string Compare(columnName key ToUpper()) == ) dictKey = columnValue; T model = default(T); model = obj as T; K objKey = (K)dictKey; dictModels Add(objKey model); finally rdr Close(); rdr Dispose(); Monitor Exit(objSync); return dictModels; #endregion #region internal util private static Hashtable CreateHashColumnName(IDataReader rdr) int len = rdr FieldCount; Hashtable ht = new Hashtable(len); for (int i = ; i < len; i++) string columnName = rdr GetName(i) ToUpper(); //不区分大小写 string columnRealName = rdr GetName(i); if (ht ContainsKey(columnName) == false) ht Add(columnName columnRealName); return ht; private static void SetValue(PropertyInfo propInfo Object obj object objValue) try propInfo SetValue(obj objValue null); catch object realValue = null; try realValue = Convert ChangeType(objValue propInfo PropertyType); propInfo SetValue(obj realValue null); catch (Exception ex) string err = ex Message; //throw ex; //在数据库数据有不符合规范的情况下应该及时抛出异常 #endregion 到这里 简单的数据访问持久化层就实现了 下面模仿楼猪使用的 写个伪SqlMapper 改善一下调用形式 丰富一下调用方法 让方法辨识度更高 四 实现伪SqlMapper BaseMapper类 代码 using System; using System Collections Generic; using System Data; using System Data Common; using System Data SqlClient; namespace AdoNetDataAccess Mapper using AdoNetDataAccess Core Contract; public abstract class BaseMapper public IDbOperation CurrentDbOperation; #region query for list public abstract IList<T> QueryForList<T>(string sqlStr) where T : class new(); public abstract IList<T> QueryForList<T>(string sqlStr Type objType) where T : class new(); public abstract IList<T> QueryForList<T>(string sqlStr CommandType cmdType List<DbParameter> listParams) where T : class new(); public abstract IList<T> QueryForList<T>(string sqlStr CommandType cmdType List<DbParameter> listParams Type objType) where T : class new(); #endregion #region query for dictionary public abstract IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr) where T : class new(); public abstract IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr Type objType) where T : class new(); public abstract IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr CommandType cmdType Type objType) where T : class new(); public abstract IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr CommandType cmdType List<DbParameter> listParams Type objType) where T : class new(); #endregion #region dataset datatable public abstract DataTable FillDataTable(string sqlStr CommandType cmdType List<DbParameter> listParams); public abstract DataSet FillDataSet(string sqlStr CommandType cmdType List<DbParameter> listParams); #endregion #region ExecuteScalar public abstract object ExecuteScalar(string sqlStr CommandType cmdType List<DbParameter> listParams); #endregion #region insert public abstract int Insert(string sqlStr); public abstract int Insert(string sqlStr CommandType cmdType List<DbParameter> listParams); public abstract bool BatchInsert(string tableName int batchSize int copyTimeout DataTable dt); #endregion #region delete public abstract int Delete(string sqlStr); public abstract int Delete(string sqlStr CommandType cmdType List<DbParameter> listParams); #endregion #region update public abstract int Update(string sqlStr); public abstract int Update(string sqlStr CommandType cmdType List<DbParameter> listParams); #endregion 上面代码中的方法您是不是很熟悉呢? 呵呵 使用 的童鞋应该会和楼猪产生更多的共鸣 SqlMapper类 代码 using System; using System Collections Generic; using System Data; using System Data Common; namespace AdoNetDataAccess Mapper using AdoNetDataAccess Core Contract; using AdoNetDataAccess Core Obj Model; public class SqlMapper : BaseMapper private SqlMapper() public SqlMapper(IDbOperation dbOperation) this CurrentDbOperation = dbOperation; #region query for list public override IList<T> QueryForList<T>(string sqlStr) return QueryForList<T>(sqlStr CommandType Text null typeof(T)); public override IList<T> QueryForList<T>(string sqlStr Type objType) return QueryForList<T>(sqlStr CommandType Text null objType); public override IList<T> QueryForList<T>(string sqlStr CommandType cmdType List<DbParameter> listParams) return QueryForList<T>(sqlStr cmdType listParams typeof(T)); public override IList<T> QueryForList<T>(string sqlStr CommandType cmdType List<DbParameter> listParams Type objType) return ModelConverter QueryForList<T>(sqlStr cmdType listParams objType this CurrentDbOperation); #endregion #region query for dictionary public override IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr) return QueryForDictionary<K T>(key sqlStr CommandType Text null typeof(T)); public override IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr Type objType) return QueryForDictionary<K T>(key sqlStr CommandType Text null objType); public override IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr CommandType cmdType Type objType) return QueryForDictionary<K T>(key sqlStr cmdType null objType); public override IDictionary<K T> QueryForDictionary<K T>(string key string sqlStr CommandType cmdType List<DbParameter> listParams Type objType) return ModelConverter QueryForDictionary<K T>(key sqlStr cmdType listParams objType this CurrentDbOperation); #endregion #region dataset datatable public override DataTable FillDataTable(string sqlStr CommandType cmdType List<DbParameter> listParams) return this CurrentDbOperation FillDataTable(sqlStr cmdType listParams); public override DataSet FillDataSet(string sqlStr CommandType cmdType List<DbParameter> listParams) return this CurrentDbOperation FillDataSet(sqlStr cmdType listParams); #endregion #region ExecuteScalar public override object ExecuteScalar(string sqlStr CommandType cmdType List<DbParameter> listParams) return this CurrentDbOperation ExecuteScalar(sqlStr cmdType listParams); #endregion #region insert public override int Insert(string sqlStr) object obj = ExecuteScalar(sqlStr CommandType Text null); int id = obj == null ? : int Parse(obj ToString()); return id; public override int Insert(string sqlStr CommandType cmdType List<DbParameter> listParams) object obj = ExecuteScalar(sqlStr cmdType listParams); int id = obj == null ? : int Parse(obj ToString()); return id; /// <summary> /// 批量插入 /// </summary> /// <param name= tableName ></param> /// <param name= batchSize ></param> /// <param name= copyTimeout ></param> /// <param name= dt ></param> /// <returns></returns> public override bool BatchInsert(string tableName int batchSize int copyTimeout DataTable dt) return this CurrentDbOperation ExecuteBatchInsert(tableName batchSize copyTimeout dt); #endregion #region delete public override int Delete(string sqlStr) return CommitSql(sqlStr CommandType Text null); public override int Delete(string sqlStr CommandType cmdType List<DbParameter> listParams) return CommitSql(sqlStr cmdType listParams); #endregion #region update public override int Update(string sqlStr) return CommitSql(sqlStr CommandType Text null); public override int Update(string sqlStr CommandType cmdType List<DbParameter> listParams) return CommitSql(sqlStr cmdType listParams); #endregion #region mit and execute sql private int CommitSql(string sqlStr CommandType cmdType List<DbParameter> listParams) return this CurrentDbOperation ExecuteNonQuery(sqlStr cmdType listParams); #endregion #region dbparameter public DbParameter CreateParameter(string paraName object paramValue) return this CurrentDbOperation CreateDbPrameter(paraName paramValue); public List<DbParameter> CreateParameterList(string[] paraNames object[] paramValues) List<DbParameter> listParams = new List<DbParameter>(); try if (paraNames Length != paramValues Length) throw new Exception( Param name and value is not equal ); for (int i = ; i < paraNames Length; i++) DbParameter param = CreateParameter(paraNames[i] paramValues[i]); listParams Add(param); catch (Exception ex) throw ex; return listParams; #endregion 上面的方法丰富实现了CRUD的常见操作 其实主要还是调用了IDbOperation接口和方法 cha138/Article/program/ASP/201311/21746
相关参考
ADO.NET的最佳实践技巧 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 简介 本文为您提供
最佳实践ADO.NET实用经验无保留曝光 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
手把手教你ADO.NET快速起步 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ADONET是微
ADO.NET读书笔记系列 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ADONET概述 一
知识大全 Apache Commons DbUtils 快速上手
ApacheCommonsDbUtils快速上手 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Hi
通过ADO.NET访问数据库 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一ADONET访问数据
Eclipse快速上手指南之使用JUnit 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 
Ajax+PHP快速上手及简单应用说明 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!对于Ajax最
Eclipse快速上手指南之使用ANT 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ant是J
C#ADO.NET操作数据代码汇总 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一.用SqlC