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数据库 ...
随机推荐
- Foxit Reader 插件下载
http://www.foxitsoftware.com/Secure_PDF_Reader/addons.php#install 百度云:http://pan.baidu.com/s/1i3DSlv ...
- 第一个c++程序 helloworld
// helloworld.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h"#include "iostream" int ...
- LeetCode49 Group Anagrams
Given an array of strings, group anagrams together. For example, given: ["eat", "tea& ...
- GCT考试如何准备
备战考试篇 回首连续的3个月的那段复习过程,感受颇多颇深!以下就各科复习,我谈谈自己的感受和经验: 语文复习: 语文主要是考察你的文学功底和素养以及已经具备的工作生活的常识.从03,04两年的考试真题 ...
- solr中通过SFTP访问文件建立索引
需求: 从oracle数据库中根据记录的文件名filename_html(多个文件以逗号隔开),文件路径path,备用文件名bakpath中获取 主机172.21.0.31上对应的html文件内容,并 ...
- TaskUtil多线程与定时任务
package com.taoban.util; /** * 执行单次任务或定时任务工具类(用于减少new Thread()和new Timer()的使用) */ public class Tas ...
- JS 鼠标事件大全
一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...
- Linux下cut命令使用
标题:cut命令的使用 作用:cut命令是对文件以行为单位,按照字节.字符.指定的域分隔符对行进行剪切,提取所需要的片段内容. 一.用法: cut [-bn] [file] 或cut -c [file ...
- oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包
匿名PL/SQL块回顾 DECLARE (可选) 定义在PL/SQL块中要使用的对象BEGIN (必须) 执行语句EXCEPTION (可选) 错误处理语句END; (必须)匿名块( ...
- 【转载】Hadoop可视化分析利器之Hue
http://qindongliang.iteye.com/blog/2212619 先来看下hue的架构图: (1)Hue是什么? Hue是一个可快速开发和调试Hadoop生态系统各种应用的一个基 ...