本文希望能给大家一些启发。前言:这两天重温经典,对ADO.NET的东西稍微深入的了解了一下,顺便写点代码练练手,全当是复习笔记吧。

创新互联主要从事成都网站设计、做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务海西,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
一、简单说说ADO.NET的5大常用对象
既然说ADO.NET,当然不能免俗地要提到5大常用对象。本文不会对ADO.NET的5大对象和它们的关系进行过多阐释,不过我们应该对下面这张图的结构有个了解:
关于上图图示中的5大对象,经常做以数据为驱动的mis系统的童鞋应该不会陌生。本文一笔带过。下面我们一步一步实现以ADO.NET为核心的数据访问程序。
二、数据访问持久化层
1、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
 listParams); - DbParameter CreateDbPrameter(string paramName, object paramValue);
 - DbDataReader ExecuteReader(string sqlStr, CommandType cmdType, List
 listParams); - DataTable FillDataTable(string sqlStr, CommandType cmdType, List
 listParams); - DataSet FillDataSet(string sqlStr, CommandType cmdType, List
 listParams); - object ExecuteScalar(string sqlStr, CommandType cmdType, List
 listParams); - int ExecuteNonQuery(string sqlStr, CommandType cmdType, List
 listParams); - ///
 - /// 批量插入
 - ///
 - /// 表名称
 - /// 组装好的要批量导入的datatable
 - ///
 - bool ExecuteBatchInsert(string tableName, int batchSize, int copyTimeout, DataTable dt);
 - void OpenConnection();
 - void CloseConnection();
 - }
 - }
 
上面的接口包括增删改查,批量插入以及数据库连接对象的连接和关闭等常用操作,您可以根据命名和参数轻松理解函数的含义。根据楼猪的开发经验,对于平时的数据库操作,上述方法差不多够用了。当然您也可以按照自己需要,重写组织添加其他函数。
2、针对一种数据源的数据操作实现
底层的数据操作接口定义好后,就要针对一种数据源,具体实现上述的数据操作。这里楼猪选择了Sql Server。我们也可以实现其他数据源的数据访问操作,按照配置,利用抽象工厂动态反射选择是哪一种数据源的实现。这里按下不表,有心的童鞋自己可以动手一试。下面是具体的实现:
到这里,我们实现了SqlServer类里的方法,对Ms SqlServer数据库我们就已经可以进行简单的基础的CRUD操作了。
三、简单直观的对象实体转换
在第二步中,我们已经实现了简单的数据CRUD操作。根据楼猪使用ORM的经验和习惯,我们也应该对一些查询结果进行转换,因为以类的组织方式比直接呈现ADO.NET对象更容易让人接受,效率高低反在其次。下面利用常见的反射原理,简单实现一个对象实体转换器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.Obj2Model
 - {
 - using AdoNetDataAccess.Core.Contract;
 - public sealed class ModelConverter
 - {
 - private static readonly object objSync = new object();
 - #region query for list
 - ///
 - /// 查询数据表项并转换为对应实体
 - ///
 - ///
 - ///
 - ///
 - ///
 - public static IList
 QueryForList (string sqlStr, CommandType cmdType, List listParams, Type objType, IDbOperation dbOperation) - where T : class, new()
 - {
 - IDataReader rdr = dbOperation.ExecuteReader(sqlStr, cmdType, listParams);
 - IList
 listModels = new List (); - 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
 - ///
 - /// 查询数据表项并转换为对应实体
 - ///
 - ///
 - ///
 - /// 字典对应key列名
 - ///
 - ///
 - ///
 - public static IDictionary
 QueryForDictionary - (string key, string sqlStr, CommandType cmdType, List
 listParams, Type objType, IDbOperation dbOperation) - where T : class, new()
 - {
 - IDataReader rdr = dbOperation.ExecuteReader(sqlStr, cmdType, listParams);
 - IDictionary
 dictModels = new Dictionary (); - 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()) == 0)
 - {
 - 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 = 0; 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,
 文章标题:ADO.NET快速上手实践总结
分享地址:http://www.csdahua.cn/qtweb/news18/121818.html网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网