FreeStyle.net
做正确的事(分析)和正确的做事(设计)
随笔- 48 文章- 1 评论- 183
博客园
首页
新随笔
联系
管理
订阅
抛开映射关系,不oo的数据访问写法
日常的开发中,数据访问层是程序员不得不去面对的重复劳动,基本上现在每个公司或个人都有自己的DbHelper,像自己日常用的有微软petshop中的几个dbhelper,或者nhibernate,或者IbatisNet,或者我自己写的数据访问工具-Qing,本来是想写成类似linq的一个工具,大家看qing的代码也可以看出一点意图,但是,不可否认,代码设计方面确实是有点垃圾,呵呵,见笑了!,现在想来,还有一个SubSonic已经很成熟地实现了类似的查询功能了!
最近在改一个项目,以前留下来的,汗,项目虽然不大,但是数据量也有好几万,访问量也不低,然后每次客户都投诉说速度很慢,分页用的竟然是gridview自带的,当然,更夸张的是查询的结果是先搜索出所有的结果的dataTable,然后在内存里面通过Filter过滤,更汗!本来一句select * form table where id=1,现在变成了select * from table 然后再在内存中过滤!
好拉,问题找出来了,改就是了,自定义分页导航可以选择AspNetPage,也可以自己写,不是本随笔的关键,先看看分页所需要的,我们除了要查询分页的数据外,还要知道表的总记录数!一般我们都是有写两个方法,一个返回分页的数据,一个返回总记录数,这样做很明显是要访问两次数据库了,创建数据库连接可是很昂贵的,所以我把他封在一个类里面,达到只创建一个连接,返回总纪录数和分页数据,先看代码
DataManager
public
class
DataManager
<
T
>
where
T : ITableScheman,
new
()
{
public
DataManager()
{
}
private
T obj
=
new
T();
private
int
_pageCount;
public
int
PageCount
{
get
{
return
this
._pageCount; }
set
{
this
._pageCount
=
value; }
}
private
bool
queryAll
=
true
;
public
bool
QueryAll
{
get
{
return
this
.queryAll; }
set
{
this
.queryAll
=
value; }
}
public
string
QueryForFields
{
get
{
StringBuilder sb
=
new
StringBuilder(
10
);
sb.Append(
"
select
"
);
for
(
int
i
=
0
; i
<
obj.Fields.Count;i
++
)
{
sb.Append(
"
[
"
);
sb.Append(obj.Fields[i]);
sb.Append(
"
]
"
);
if
(i
!=
obj.Fields.Count
-
1
)
{
sb.Append(
"
,
"
);
}
}
sb.Append(
"
from
"
);
sb.Append(obj.TableName);
return
sb.ToString();
}
}
public
IDataReader QueryAndGetPageCount()
{
string
sqlSelect
=
queryAll ?
"
select top 10 * from
"
+
obj.TableName : QueryForFields;
string
constr
=
ConfigurationManager.ConnectionStrings[
"
ConnectionString
"
].ConnectionString;
IDbConnection con
=
new
SqlConnection(constr);
IDbCommand cmd
=
con.CreateCommand();
IDataReader dr
=
null
;
try
{
con.Open();
cmd.CommandText
=
"
select count(*) from
"
+
obj.TableName;
this
._pageCount
=
Convert.ToInt32(cmd.ExecuteScalar());
cmd.CommandText
=
sqlSelect;
dr
=
cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch
{
con.Close();
cmd.Dispose();
}
return
dr;
}
}
这里面用到了范型,其中T继承了ITableSchema,这个接口定义了数据表的结构接口,里面的东西大家看看就知道是怎么回事了,直接点就是一个映射对应表的结构的接口,包括了主键,外键,字段集合等。
public
interface
ITableSchema
{
string
TableName
{
get
;}
string
PrimaryKey
{
get
;}
Dictionary
<
string
,
string
>
ForeignKeyList
{
get
;}
//
<表,外键名称>
List
<
string
>
Fields
{
get
;}
//
字段集合,取需要的字段
}
然后我们写一个继承自这个接口的类,就可以了,就不是我们所写的实体类了,直接面向数据表!
public
class
TestTable:ITableScheman
{
TableInterface 成员
#region
TableInterface 成员
public
string
TableName
{
get
{
return
"
testtable
"
;
}
}
public
string
PrimaryKey
{
get
{
return
"
[id]
"
;
}
}
public
Dictionary
<
string
,
string
>
ForeignKeyList
{
get
{
return
null
;
}
}
public
List
<
string
>
Fields
{
get
{
List
<
string
>
s
=
new
List
<
string
>
();
s.Add(
"
id
"
);
return
s;
//
return null;
}
}
#endregion
}
接下来是测试
Northwind.Web.DB.DataManager<Northwind.Web.DB.TestTable> p = new Northwind.Web.DB.DataManager<Northwind.Web.DB.TestTable>();
using (IDataReader dr = p.QueryAndGetPageCount())
{
while (dr.Read())
{
this.DropDownList1.Items.Add(new ListItem(dr[1].ToString()));
}
this.Label1.Text = p.PageCount.ToString();
}
这里我只是绑定到一个列表上去,而且分页的sql语句只是简单的top而已,大家可以替换为自己的sql分页语句,这里只是一个思路而已。
我们可以根据思路继续拓展,包括修改数据的功能!
结论:虽然不oo,但是思路清晰,不失为一个轻量级的访问数据层,希望有帮助咯!
posted @ 2008-03-16 14:09
Awen
阅读(334)
评论(4)
编辑
收藏
网摘
发表评论
1108738
回复
引用
查看
#1楼
2008-03-16 15:50 |
金色海洋(jyk)
我个人感觉这样的文章是可以放在首页的,当然还会有一些人会说不应该放。
回复
引用
查看
#2楼
[
楼主
]2008-03-16 18:04 |
Awen
呵呵,谢谢海洋了,我也看了你许多随笔,感觉你开发的方式也不为了oo而oo,这篇是我自己改一个项目有感的,不发首页了,反正我只是想表达下自己的想法而已,有个地方发表就ok了哦,呵呵!
回复
引用
#3楼
2008-03-16 21:02 |
xmanx[未注册用户]
可以参考
http://www.cnblogs.com/mail-ricklee
中 IBatisNet的方式。
回复
引用
查看
#4楼
[
楼主
]
2008-03-16 21:11 |
Awen
@xmanx
呵呵,那东西好像很大型,暂时不想去看,里面有ibatisnet吗?
刷新评论列表
刷新页面
返回页首
发表评论
昵称:
[登录]
[注册]
主页:
邮箱:
(仅博主可见)
验证码:
看不清,换一个
评论内容:
登录
注册
[使用Ctrl+Enter键快速提交评论]
0
1108395
链接:
切换模板
导航:
网站首页
社区
新闻
博问
闪存
网摘
招聘
找找看
Google搜索
China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务
相关文章:
最新IT新闻:
Google号召社区力量为互联网加速
Twitter无处不在 魔兽世界Twitter发送器插件发布
Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新
预测:Twitter最可能收购的十家公司
网易澄清:与暴雪合资公司仅提供技术支持
相关链接:
<
2008年3月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我参与的团队
北京.NET俱乐部(0/0)
我的标签
monorail
(2)
MVC
(1)
asp.net插件 插件 插件实现 委托
(1)
SubSonic使用
(1)
SubSonic开发
(1)
随笔分类
(40)
asp.net 应用程序优化笔记系列(4)
asp.net几点几?(6)
asp走马观花(1)
C#3.5学习(1)
CEIMS(2)
Java点滴(1)
MVC-MonoRail(4)
Qing相关系列(2)
SubSonic(2)
UI设计(4)
持久层学习(1)
代码生成相关(4)
看看ajax都做了什么?(3)
软件设计相关(2)
设计模式学习(3)
数据结构学习
随笔档案
(46)
2008年11月 (1)
2008年9月 (1)
2008年8月 (1)
2008年6月 (1)
2008年5月 (3)
2008年4月 (3)
2008年3月 (5)
2008年2月 (1)
2008年1月 (9)
2007年12月 (4)
2007年11月 (2)
2007年10月 (7)
2007年9月 (3)
2007年8月 (5)
相册
旅游
我的涂鸦
一些图片
Ajax学习
ExtJs学习
Extjs中文站点
老赵点滴
学习网
c#学习
dotnet知识林
Microsoft---Download
DNN收藏
dnn入门-网站模板
LinQ
lovecherryLinQ系列
webabcd-LinQ系列
宋国安linq系列
Wpf学习收藏
artech我的WCF之旅"系列
wf编程学习笔记收藏
wpf天天见系列
周银辉 [WPF实践之路]
技术拓展学习
Fortumo串连贴纸
9篇关于nHibernate的学习宝典
a java programmer
c#结合Excel知识集锦
clr学习
Excel-Msdn
iBATIS In Action系列
Ibatis学习
MonoRail学习笔记系列文章
nhibernate几篇文章
nhibernate考察
RubyOnRail学习博客
sql学习
Terrylee
Windbg系列
xsl学习系列
编程技术学习
采集学习博客
采集学习博客
测试
飞旋文化传播(佛山)
飞旋文化传播(佛山)
福娃的Ibatis系列
蜡人张的报表系列
善友的Ibatis系列
小庄wcf
学习网
张老三
开源项目
Hello开源
java,.net开源
my resum
开源资源收集
控件开发学习
ClinginBoy
Thin的博客
WebABCD
老外博客
dotnetslackers
mattberseth(asp.net ajax 大牛)
Nikhil
Scott Hanselman's ComputerZen.com
scottgu的博客
微软杂志下载
资料收藏
设计模式学习
dzj
lovecherry设计模式学习
最新评论
1. re: asp.net定时任务实现(原创)
但是这个方法没办法实现定时转向指定页面的功能。 (我到底有多菜)
2. re: 一个三层结构的留言板,结合了ajax效果
抱歉!给您带来麻烦了!
您访问的资源不存在,请确认您输入的地址是否正确,如果问题持续存在,请发邮件至contact@cnblogs.com与网站管理员联系。
(ff)
3. re: asp.net定时任务实现(原创)
在这里写内容 (在这里写标题)
4. re: WinFormUI-Docking初级使用
楼主一共用了那些组件,望告知,谢谢。 (咸鱼翻身)
5. re: Qing问题集中帖
try { connection.Open(); int rows=cmd.ExecuteNonQuery(); return rows; } c... (iret)
阅读排行榜
1. Qing1.0快速数据访问框架(源码)(3063)
2. asp.net插件实现(2649)
3. asp.net优化探讨系列(3)(2353)
4. WebForm里面的MVC?(2129)
5. asp.net优化探讨系列(1)(1897)
评论排行榜
1. asp.net优化探讨系列(3)(47)
2. Qing1.0快速数据访问框架(源码)(18)
3. asp.net优化探讨系列(2)(16)
4. WebForm里面的MVC?(14)
5. asp.net插件实现(14)