本文希望能给大家一些启发。前言:这两天重温经典,对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。内容未经允许不得转载,或转载时需注明来源: 快上网