Spiga
Posts - 46, Articles - 1, Comments - 189
Cnblogs
Dashboard
Login
Home
Contact
Gallery
RSS
裤裆网 coodown.net
Android 安卓 symbian 塞班 java 软件下载 游戏下载 手机主题下载 智能机下载
抛开映射关系,不oo的数据访问写法
2008-03-16 14:09 by Awen, 376 visits,
收藏
,
编辑
日常的开发中,数据访问层是程序员不得不去面对的重复劳动,基本上现在每个公司或个人都有自己的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,但是思路清晰,不失为一个轻量级的访问数据层,希望有帮助咯!
绿色通道:
好文要顶
关注我
收藏该文
与我联系
Add your comment
4 条回复
1108738
#1楼
金色海洋(jyk)
2008-03-16 15:50
我个人感觉这样的文章是可以放在首页的,当然还会有一些人会说不应该放。
回复
引用
查看
#2楼
[
楼主
]
Awen
2008-03-16 18:04
呵呵,谢谢海洋了,我也看了你许多随笔,感觉你开发的方式也不为了oo而oo,这篇是我自己改一个项目有感的,不发首页了,反正我只是想表达下自己的想法而已,有个地方发表就ok了哦,呵呵!
回复
引用
查看
#3楼
xmanx[未注册用户]
2008-03-16 21:02
可以参考
http://www.cnblogs.com/mail-ricklee
中 IBatisNet的方式。
回复
引用
#4楼
[
楼主
]
Awen
2008-03-16 21:11
@xmanx
呵呵,那东西好像很大型,暂时不想去看,里面有ibatisnet吗?
回复
引用
查看
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
春节后礼品回收iPhone成新宠燕窝被冷落
·
分析称苹果近1000亿现金储备最佳用途是派息
·
扎克伯格11件蠢事:曾同意将Facebook卖给雅虎
·
最想要的Entity Framework功能
·
专访Jeffrey Richter:Windows 8是微软的重中之重
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
About
昵称:
Awen
园龄:
4年6个月
粉丝:
1
关注:
0
最新评论
Re:一个喜欢网页设计的程序员
想问一下,你的这张图片怎么会是从下往上加载的呢,难道是opera的功劳,呵 -- J717273419
Re:asp.net定时任务实现(原创)
我也有同样的问题,这段代码写在哪?既然不是global里面,那是任何网页的cs文件里? -- walkerwang
Re:asp.net定时任务实现(原创)
请问一下,我不知道该怎么描述。我也需要一个定时的功能,例如:数据提交15分钟后再写入数据库,或者帐号锁定7天后自动解锁,这样的功能要怎么实现呢?难道也用Timer吗? -- 怪稻_KID
Re:asp.net定时任务实现(原创)
@我到底有多菜我想你需要的是客户端脚本吧,呵呵,不知道你为什么要定时转向指定页面的功能,定时作业与用户具体访问不在同一线上,总不能定时让所有用户都跳到某个页面吧,HttpContext.Current... -- Awen
Re:asp.net定时任务实现(原创)
@
kedee
与global和HttpModule无关,我这个是利用缓存定时回调实现的定时作业。 -- Awen
日历
<
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
随笔分类
Rss
asp.net 应用程序优化笔记系列(4)
Rss
asp.net几点几?(6)
Rss
asp走马观花(1)
Rss
C#3.5学习(1)
Rss
CEIMS(2)
Rss
Java点滴(1)
Rss
MVC-MonoRail(4)
Rss
Qing相关系列(2)
Rss
SubSonic(2)
Rss
UI设计(4)
Rss
持久层学习(1)
Rss
代码生成相关(4)
Rss
看看ajax都做了什么?(3)
Rss
软件设计相关(2)
Rss
设计模式学习(3)
Rss
数据结构学习(0)
随笔档案
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#学习
c# winform 开发系列
dotnet知识林
Microsoft---Download
超级牛人老外的博客
DNN收藏
dnn入门-网站模板
LinQ
lovecherryLinQ系列
webabcd-LinQ系列
宋国安linq系列
Wpf学习收藏
artech我的WCF之旅"系列
wf编程学习笔记收藏
wpf天天见系列
周银辉 [WPF实践之路]
技术拓展学习
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设计模式学习