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

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

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

我们接着上文继续完成我们的ado.net简单实践。

五、dal层数据访问实现【示例代码】

在这里我们使用前一篇文章里实现的数据持久化层和伪SqlMapper对象,实现数据操作。下面我们来看看Dal下核心的Dao如何实现:

还记得我们在IBatis.net下面的dao类是怎么实现的吗?没错,我们根据一个基类BaseDAO和它的构造函数,实现dao的配置加载。但是楼猪的实现没有那么复杂和强大,本文的实现其实就是通过BaseDAO和构造函数获取数据库连接对象的key,初始化一个SqlMapper,然后利用SqlMapper对象进行基本的CRUD等等数据操作。那么我们如何利用BaseDAO和构造函数就像以前在IBatis.net系列文章里的提到的Dal层下那样进行SqlMapper的初始化呢?

1、在AdoNetDataAccess.Mapper下我们定义公共的BaseDAO类

  1. namespace AdoNetDataAccess.Mapper 
  2.     public abstract class BaseDAO 
  3.     { 
  4.         #region Properties 
  5.  
  6.         public SqlMapper SqlMapper { getset; } 
  7.  
  8.         #endregion 
  9.  
  10.         #region Constructor 
  11.  
  12.         private BaseDAO() 
  13.         { 
  14.         } 
  15.  
  16.         /// <summary> 
  17.         /// SqlMapper属性适用 
  18.         /// </summary> 
  19.         /// <param name="mapperName"></param> 
  20.         public BaseDAO(string mapperName) 
  21.         { 
  22.             this.SqlMapper = MapperUtill.GetMapper(mapperName); 
  23.         } 
  24.  
  25.         #endregion 
  26.     } 

2、初始化SqlMapper的实用类

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Configuration; 
  4.  
  5. namespace AdoNetDataAccess.Mapper 
  6.     using AdoNetDataAccess.Core.Contract; 
  7.     using AdoNetDataAccess.Core.Implement; 
  8.  
  9.     public sealed class MapperUtill 
  10.     { 
  11.         #region fields 
  12.  
  13.         public static string currentSqlKey = "sqlConn"
  14.  
  15.         public static int cmdTimeOut = 15; 
  16.  
  17.         private static readonly object objSync = new object(); 
  18.  
  19.         private static readonly IDictionary<string, SqlMapper> dictMappers = new Dictionary<string, SqlMapper>(); 
  20.  
  21.         #endregion 
  22.  
  23.         #region constructor and methods 
  24.  
  25.         private MapperUtill() 
  26.         { 
  27.  
  28.         } 
  29.  
  30.         static MapperUtill() 
  31.         { 
  32.             try 
  33.             { 
  34.                 cmdTimeOut = int.Parse(ConfigurationManager.AppSettings["db_timeOut"]); 
  35.             } 
  36.             catch 
  37.             { 
  38.                 cmdTimeOut = 15; 
  39.             } 
  40.             //实例化SqlDbMapper 
  41.             for (int i = 0; i < ConfigurationManager.ConnectionStrings.Count; i++) 
  42.             { 
  43.                 string key = ConfigurationManager.ConnectionStrings[i].Name; 
  44.                 string value = ConfigurationManager.ConnectionStrings[i].ConnectionString; 
  45.                 CreateMapper(key, value, cmdTimeOut); 
  46.             } 
  47.         } 
  48.  
  49.         public static SqlMapper GetSqlMapper(string key) 
  50.         { 
  51.             return MapperUtill.GetMapper(key); 
  52.         } 
  53.  
  54.         public static SqlMapper GetCurrentSqlMapper() 
  55.         { 
  56.             return MapperUtill.GetMapper(currentSqlKey); 
  57.         } 
  58.  
  59.         public static void CreateMapper(string connKey, string sqlConStr, int connTimeOut) 
  60.         { 
  61.             IDbOperation operation = new SqlServer(sqlConStr, connTimeOut); 
  62.             SqlMapper mapper = new SqlMapper(operation); 
  63.             dictMappers.Add(connKey.ToUpper().Trim(), mapper);//不区分大小写 
  64.         } 
  65.  
  66.         public static SqlMapper GetMapper(string sqlConKey) 
  67.         { 
  68.             if (string.IsNullOrEmpty(sqlConKey)) 
  69.             { 
  70.                 throw new Exception("数据库连接字符串主键为空!"); 
  71.             } 
  72.             sqlConKey = sqlConKey.ToUpper();//不区分大小写 
  73.             SqlMapper mapper = null
  74.             if (dictMappers.ContainsKey(sqlConKey)) 
  75.             { 
  76.                 mapper = dictMappers[sqlConKey]; 
  77.             } 
  78.             else 
  79.             { 
  80.                 throw new Exception(string.Format("没有{0}所对应的数据库连接", sqlConKey)); 
  81.             } 
  82.             return mapper; 
  83.         } 
  84.  
  85.         /// <summary> 
  86.         /// 释放所有 
  87.         /// </summary> 
  88.         public void Release() 
  89.         { 
  90.             foreach (KeyValuePair<string, SqlMapper> kv in dictMappers) 
  91.             { 
  92.                 SqlMapper mapper = kv.Value; 
  93.                 if (mapper == null
  94.                 { 
  95.                     continue
  96.                 } 
  97.                 mapper.CurrentDbOperation.CloseConnection(); 
  98.             } 
  99.             dictMappers.Clear(); 
  100.         } 
  101.  
  102.         #endregion 
  103.  
  104.     } 

这个实用类的重要作用就是初始化配置文件里connectionStrings配置节点,以获取sql连接对象必须的连接字符串。

3、PersonDao类

下面就是针对具体的Person表的数据操作了:

  1. using System.Collections.Generic; 
  2. using System.Data; 
  3.  
  4. namespace AdoNetDataAccess.Dal.Dao 
  5.     using AdoNetDataAccess.Dal.Model; 
  6.     using AdoNetDataAccess.Dal.Utility; 
  7.     using AdoNetDataAccess.Mapper; 
  8.  
  9.     public class PersonDao : BaseDAO 
  10.     { 
  11.         public PersonDao() 
  12.             : base("sqlConn")//sqlConn是<connectionStrings>配置节点的一个name 
  13.         { 
  14.         } 
  15.  
  16.         public int Insert(string sqlInsert) 
  17.         { 
  18.             int id = this.SqlMapper.Insert(sqlInsert); 
  19.             //object obj = this.SqlMapper.ExecuteScalar(sqlInsert, System.Data.CommandType.Text, null); 
  20.             return id; 
  21.         } 
  22.  
  23.         public bool BatchInsert(IList<Person> listModels) 
  24.         { 
  25.             int batchSize = 50000; 
  26.             int copyTimeOut = 60; 
  27.             DataTable dt = DataTableHelper.CreateTable<Person>(listModels); 
  28.             bool flag = this.SqlMapper.BatchInsert(typeof(Person).Name, batchSize, copyTimeOut, dt); 
  29.             return flag; 
  30.         } 
  31.  
  32.         public int Update(string sqlUpdate) 
  33.         { 
  34.             int result = this.SqlMapper.Update(sqlUpdate); 
  35.             return result; 
  36.         } 
  37.  
  38.         public IList<Person> SelectPersons(string sqlSelect) 
  39.         { 
  40.             IList<Person> listPersons = this.SqlMapper.QueryForList<Person>(sqlSelect); 
  41.             return listPersons; 
  42.         } 
  43.  
  44.         public IDictionary<int, Person> SelectDictPersons(string sqlSelect) 
  45.         { 
  46.             IDictionary<int, Person> dictPersons = this.SqlMapper.QueryForDictionary<int, Person>("Id", sqlSelect); 
  47.             return dictPersons; 
  48.         } 
  49.  
  50.         public DataTable SelectPersonTable(string sqlSelect) 
  51.         { 
  52.             DataTable dt = this.SqlMapper.FillDataTable(sqlSelect, CommandType.Text, null); 
  53.             return dt; 
  54.         } 
  55.  
  56.         public DataSet SelectPersonDataSet(string sqlSelect) 
  57.         { 
  58.             DataSet ds = this.SqlMapper.FillDataSet(sqlSelect, CommandType.Text, null); 
  59.             return ds; 
  60.         } 
  61.  
  62.         public int Delete(string sqlDelete) 
  63.         { 
  64.             int result = this.SqlMapper.Delete(sqlDelete); 
  65.             return result; 
  66.         } 
  67.  
  68.     } 

到这里,一个dao类操作就实现了。然后我们按步就班实现对外调用的服务接口。在表现层调用吧。

六、表现层的调用
1、配置文件

  1. <appSettings> 
  2.   <add key="db_timeOut" value="5000"/> 
  3. </appSettings> 
  4. <connectionStrings> 
  5.   <add name="sqlConn" connectionString="Data Source=.\sqlexpress; Initial Catalog=TestDb; User Id=sa; Password=123456;"/> 
  6.   <add name="sqlConnStr1" connectionString="Data Source=.\sqlexpress; Initial Catalog=TestDb; User Id=sa; Password=123456;"/> 
  7.   <add name="sqlConnStr2" connectionString="Data Source=.\sqlexpress; Initial Catalog=TestDb; User Id=sa; Password=123456;"/> 
  8. </connectionStrings> 

其中,connectionString是必须的,如果没有,我们无法加载调用可用的SqlMapper。

2、CRUD操作测试

  1. using System; 
  2. using System.Collections; 
  3. using System.Collections.Generic; 
  4. using System.Data; 
  5.  
  6. namespace OOXXWebApp 
  7.     using AdoNetDataAccess.Dal; 
  8.     using AdoNetDataAccess.Dal.Model; 
  9.  
  10.     public partial class _Default : System.Web.UI.Page 
  11.     { 
  12.         protected void Page_Load(object sender, EventArgs e) 
  13.         { 
  14.             if (!IsPostBack) 
  15.             { 
  16.                 //增删改查测试 
  17.                 string sqlInsert = "INSERT Person (FirstName,LastName,Weight,Height) VALUES( 'jeff','wong',70,180) SELECT @@IDENTITY FROM Person(NOLOCK)"
  18.                 string sqlUpdate = "UPDATE Person SET Height=178 WHERE Id=1"
  19.                 string sqlSelect = "SELECT TOP 100 * FROM Person(NOLOCK)"
  20.                 string sqlDelete = "DELETE Person  WHERE Id>10 AND Id<100"
  21.  
  22.                 IList<Person> listModels = new List<Person>(); 
  23.                 for (int i = 0; i < 500000; i++) 
  24.                 { 
  25.                     Person model = new Person(); 
  26.                     model.FirstName = "Jeff"
  27.                     model.LastName = "Wong"
  28.                     model.Weight = 70; 
  29.                     model.Height = 180; 
  30.                     listModels.Add(model); 
  31.                 } 
  32.  
  33.                 Response.Write("Test Beginning<br/>"); 
  34.  
  35.                 int id = ServiceFactory.CreatePersonService().Add(sqlInsert); 
  36.                 Response.Write(string.Format("<br/>Insert and return id:{0}", id)); 
  37.  
  38.                 bool flag = ServiceFactory.CreatePersonService().BatchInsert(listModels); 
  39.                 Response.Write(string.Format("<br/> Batch Insert {0}", flag ? "succeed" : "failed")); 
  40.  
  41.                 IList<Person> listPersons = ServiceFactory.CreatePersonService().GetPersons(sqlSelect); 
  42.                 Response.Write(string.Format("<br/>Select pesons and return persons:{0}", listPersons.Count)); 
  43.  
  44.                 IDictionary<int, Person> dictPersons = ServiceFactory.CreatePersonService().GetDictPersons(sqlSelect); 
  45.                 Response.Write(string.Format("<br/>Select pesons and return dictionary persons:{0}", dictPersons.Count)); 
  46.  
  47.                 DataTable dt = ServiceFactory.CreatePersonService().GetPersonTable(sqlSelect); 
  48.                 Response.Write(string.Format("<br/>Select pesons and return persons:{0}", dt.Rows.Count)); 
  49.  
  50.                 DataSet ds = ServiceFactory.CreatePersonService().GetPersonDataSet(sqlSelect); 
  51.                 Response.Write(string.Format("<br/>Select pesons and return persons:{0}", ds.Tables[0].Rows.Count)); 
  52.  
  53.                 int affectNum = ServiceFactory.CreatePersonService().Modify(sqlUpdate); 
  54.                 Response.Write(string.Format("<br/>Update and affect rows :{0}", affectNum)); 
  55.  
  56.                 affectNum = 0; 
  57.                 affectNum = ServiceFactory.CreatePersonService().Remove(sqlDelete); 
  58.                 Response.Write(string.Format("<br/>Delete and affect rows :{0}", affectNum)); 
  59.  
  60.                 Response.Write("<br/><br/>Test End."); 
  61.             } 
  62.         } 
  63.     } 

这个就不用多说了吧,表现层写SQL语句调用写好的服务就行了。比较不舒服的地方就是SQL语句不得不写在类里面,如果自动生成或者独立放在xml下实现可配置的形式那就更好了,当然sql语句不是我们讨论的重点,您有好的方法可以自己扩展实现更人性化的功能,减少书写SQLl语句的工作。

七、最后,对demo工程文件结构进行简单说明。
1、数据持久化层AdoNetDataAccess.Core
2、SqlMapper层AdoNetDataAccess.Mapper(引用AdoNetDataAccess.Core)
3、具体数据操作使用层AdoNetDataAccess.Dal(引用AdoNetDataAccess.Mapper)
4、表现层AdoNetDataAccessWebApp(引用AdoNetDataAccess.Dal)
可以看出,工程里的文件结构还是很清晰的,需要学习的童鞋不妨下载使用试试看吧。

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