NSS_05 数据访问选型
在数据访问层上很想用orm框架, 选用Nhibernate或ef, 可以直接操作类对象, 避免转换, 更加的面向对象,更重要的是开发起来就方便多了。 但是从网上了解到这些框架太高级了, 用得不好到时会有性能问题, 针对这个方面, 还是等以后熟悉了再用吧。 剩下linq也不熟,时间不允许了, 所以选用Entlib5.0, 总比ado.net要方便一些的吧。
其实使我坚定下来使用entlib主要是看到一个功能: "Retrieving data as a sequence of objects."的ExecuteSprocAccessor和ExecuteSqlStringAccessor这样直接返回对象类型的查询结果, 岂不是很棒, 大概看了一下使用方法,也不是很复杂。最后发现不认真害死人啊。
在实际使用中才发现这俩方法, 每个方法都需要内建一个类来实现IParameterMapper和IRowMapper来传递参数和结果集与对象字段的映射。 超级麻烦(也许我还不知道更简便的用法), 这样用会使人疯掉。想来想去, 反正结果集到类对象都需要一个转换过程,还不如自己写转换好了。
然后问题又来了, 是返回DataTable然后解析呢, 还是直接返回DataReader, 查了一下谷歌。看到下面参考的第二个网站,作者分别通过executeDataSet, IDataReader, ExecuteSqlStringAccessor三种方式访问数据库并转化为对象, 结果为:
Mapped: 50000 Records in 1115894 Ticks via DataSet
Mapped: 50000 Records in 563554 Ticks via ExecuteSqlStringAccessor
Mapped: 50000 Records in 562318 Ticks via IDataReader/IDataRecord
看起来通过IDataReader的性能最高, 作者选用ExecuteSqlStringAccessor也是看中它能方便地转化为对象。但由于上面原因, 我只能选用IDataReader.在使用中发现几个问题。
- 检索到空值
一般返回结果可以用类似reader.getString(0)或reader[0]的形式来获取数据, 但是如果这一项为空的话, 就会报异常。得首先用reader.IsDbNull来判断是否为空, 网上查到reader.getValue()在空值是不会异常,返回空字符地中,不过没有测试。 我用的是另一种方法,如下面代码示例
using (DbCommand cmd = db.GetSqlStringCommand(this.getPaginationSql(sql.ToString())))
{
db.AddInParameter(cmd, "startRow", DbType.UInt32, start);
db.AddInParameter(cmd, "endRow", DbType.UInt32, start + limit);
List<User> user = new List<User>();
using (IDataReader reader = db.ExecuteReader(cmd))
{
while (reader.Read())
{
user.Add(new User {
User_id = reader["user_id"] as string,
User_name = reader["user_name"] as string,
User_pwd = reader["user_pwd"] as string,
Description = reader["description"] as string,
Phone = reader["phone"] as string,
Email = reader["email"] as string,
InvalidTime = reader["invalidtime"] as DateTime?,
CreateTime = reader["createtime"] as DateTime?,
Last_login_time = reader["last_login_time"] as DateTime?
});
}
}
}
在加入List时, 有时会将已经排序好的对象顺序打乱, 这就需要在前前store中配置排序, 对总的功能不影响.反正用extjs,前台就多做一点事了。
--------------------------------------------------------------------------------------------------------------------------------------------
在后面测试时发现,如果store中加入sorter, 则在grid分页后, 每次加载数据后, 行号插件都会重新从1开始计算, 又没找到原因,只能暂时取消前台这个排序啦, 有高手赐教一下子不?
「参考」
- http://msdn.microsoft.com/en-us/library/ff953187(v=pandp.50).aspx
- http://markcoleman.tumblr.com/post/2628469993/three-different-ways-to-access-data-via-enterprise
NSS_05 数据访问选型的更多相关文章
- #数据技术选型#即席查询Shib+Presto,集群任务调度HUE+Oozie
郑昀 创建于2014/10/30 最后更新于2014/10/31 一)选型:Shib+Presto 应用场景:即席查询(Ad-hoc Query) 1.1.即席查询的目标 使用者是产品/运营/销售 ...
- 同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层
背景 17年开始,公司开始向DotNet Core转型,面对ORM工具的选型,当时围绕Dapper和EF发生了激烈的讨论.项目团队更加关注快速交付,他们主张使用EF这种能快速开发的ORM工具:而在线业 ...
- ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...
- 高性能Javascript--高效的数据访问
接上一篇,希望能写一个高性能Javascript专题. 第一篇:高性能Javascript--脚本的无阻塞加载策略. 参考摘录<高性能Javascript>. 经典计算机科学的一个问题是, ...
- 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro
LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...
- 架构从最简单的数据访问框架(ORM)到资源调度和治理中心(SOA)说起
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构当网站流量很小时,只需一个应用,将 ...
- ADO.NET数据访问模板整理
/// <summary> /// 数据访问类:hi_test /// </summary> public partial class TestDA { public Test ...
- ADO.NET数据访问技术
ADO.NET数据访问技术 就是将C#和MSSQLl连接起来的纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用.是所有数据访问技术的基础. A ...
- Oracle数据访问组件ODAC的安装方法
Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库 ...
随机推荐
- 倒数计数器-CountDownLatch
最近写一个多线程程序,老是MAIN方法执行完了子线程还没执行完(不知道以前怎么玩儿的),得不到最终结果,于是找到了CountDownLatch CountDownLatch是一个同步辅助类,java. ...
- Java SE ---流程控制语句
java的控制流程有三种: 一,顺序流程 自上而下,按照代码的先后顺序执行 二,分支流程 1,if/else语句 2,swit ...
- linux-i386(ubuntu)下编译安装gsoap_2.8.17过程记录
过程记录 : 1.下载gsoap_2.8.17.zip 并 解压 : $unzip gsoap_2.8.17.zip 2.进入解压后的目录gsoap-2.8 3.自动配置编译环境: $ ...
- Java基础知识强化之多线程笔记06:Lock接口 (区别于Synchronized块)
1. 简介 我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式 ...
- 【开源项目6】介绍MenuDrawer这个牛x的控件,实现左右出菜单,上下出菜单
现在很多应用都很潇洒的从左边屏幕手势一划出个左边的隐藏菜单,右边一划出个隐藏菜单,上边一划出个隐藏菜单,下边一划出个隐藏菜单.或者像android的API16左右的激活列表项的功能.很多人肯定都很着迷 ...
- http请求数据
/// <summary> /// http请求post数据 /// </summary> /// <param name=&q ...
- [Excel操作]Microsoft Office Excel 不能访问文件
最近,客户服务器迁移,因操作系统环境变化而引起的的环境问题一堆,遇到的问题并解决方法在“[Excel]操作”类别会体现. Microsoft Office Excel 不能访问文件“C:\\LMSEx ...
- freeCodeCamp:Diff Two Arrays
比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素.换言之,返回两个数组的差异. function diff(arr1, arr2) { var newArr = []; ...
- 【ASP.NET基础】简单企业产品展示网站--产品编辑CRUD
摘要:本文记录创建一个小的.简单的产品网站的步骤. 一,搭建一个简单的产品展示网站,熟悉以下知识点:NVelocity模板引擎.Ajax无刷新页面请求,文件上传,Row_Number实现分页,ckEd ...
- javascript事件代理(委托)
之前有接触过事件代理,但是印象并不深刻.这次记下来加强印象. 用个大家比较常见的代码举例子: html dom结构: <ul id="ul1"> <li>0 ...