data shaping(又可以被称为分层记录集)
如果你对access非常熟悉的话,它就类似与其中的子表。在你使用vb
进行数据库开发的时候是你的最佳选择。
这种技术有很强大的运用场合,特别适应与oltp等企业级运用程序的开发。
它允许你使用一种树状结构来表现你的数据,所以它特别适合与
来给用户显示有关联的数据表格形式。
简单的来说,就是它有一个母表(recordset)然后
该母表中的某个字段中可以再容纳一个子表(recordset)
当然一般来说,该子表中的某一个字段(例如主索引)和母表中的该字段
是关联的(relationship),这样当你执行一个查询后,结果将返回一个
多记录集.这种data shaping技术给我们带来的好处如下:
1。性能上的提高,只要合理运用该技术,就能够大大提高
asp连接数据库程序的性能.你也不必再为同时显示复杂的
相互关联的数据表单而发愁了。
2。编程上的大大简化:由于它引入的分层记录集结构,
使用树状视图来显示记录,你会发现你使用data shaping技术显示出来
的数据非常的美观。
还是以前的方法,废话少说,让代码来发言把:
本例子将使用sql server中带的例子数据库pubs
如何使用data shaping编程:
准备工作如下:
1。你应该安装有msdatashape oledb provider(在mdac2。0版本以上均带该数据源提供者)
2。你应该会编写shape语言,注意这不是一般的sql语句,具体的语法你可以查看
access中的帮助文件。
几个必须注意的地方
(i)建立一个msdatashape oledb provider的connectionstring如下(呵呵,看来我的那篇
数据库连接手册又可以加点新东东了):
这是一个很普通的连接字符串,呵呵,其中的kanga其实就是sql server在微软内部的代号
strconn = "provider=sqloledb;data source=kanga;" &_
" initial catalog=pubs;user id=sa;passwprd="
好,现在加入msdatashape oledb provider部分
strconn = "provider=msdatashape; data " & strconn
好了,现在你已经设置数据的提供者为msdatashape,
注意哦其中的数据源提供者是你真正的dsn部分。
(ii)shape语言
shape语法你可以在ado的帮助中可以找到详细的描述,我也不罗嗦
一般最常用的语句如下:
shape {parent command} [as parent alias]
append ({child command} [as child alias]
relate parent_column to child_column) [as parent_column_name]
一个最简单的例子如下:
shape {select * from publishers}
append ({select * from titles}
relate pub_id to pub_id) as rstitles
上面的语句将titles表作为publishers的一个子表关联在一起,那么怎么访问它
的数据了,语法如下:
set rstitles = rspublishers("rstitles").value
现在的rstitles就是一个记录集,它就是子表中的数据
aspshape.asp文件代码如下:
<%
dim rspublishers
dim rstitles
dim strshapeconn
dim strshape
dim strconn
strconn = "provider=sqloledb;data source=kanga;" &_
" initial catalog=pubs;user id=sa;passwprd="
set rspublishers = server.createobject("adodb.recordset")
strshapeconn = "provider=msdatashape; data " & strconn
strshape = "shape {select * from publishers}" & _
" append ({select * from titles}" & _
" relate pub_id to pub_id) as rstitles"
rspublishers.open strshape,strshapeconn
response.write "<ul>"
while not rspublishers.eof
response.write "<li>" & rspublishers("pub_name")
response.write "<ul>"
下面开始显示子表的数据
set rstitles = rspublsihers("rstitles").value
while not rstitles.eof
response.write "<li>" & rstitles("title")
rstitles.movenext
wend
response.write "</ul>"
rspublishers.movenext
wend
response.write "</ul>"
rspublishers.close
set rspublishers = nothing
set rstitles = nothing
%>
大家可以运行以上的代码然后观看它的结果,再和平常的
使用sql查询出来的相比较一下。
附注:这个时候只要再附加一点dhtml的语句,就能够做成
树状结构的收起和展开效果(就是类似与资源管理器左边的那个效果)
呵呵,这方面掉掉可是非常在行的把。
呵呵,上面介绍的只是很简单的一个子表,下面简单介绍一下
多子表的情况。
如果你的数据表中只有一个子表的话,其实使用sql也能够来完成的,
还不能够充分显示data shaping技术的优势,但是如果你的母表中
同时有多个字段和其他的表有关联的话,你就可以充分看到这个技术的
威力了。
下面给出一个两个子表的例子
shape {select * from publishers}
append ({select * from titles}
relate pub_id to pub_id) as rstitles,
({select * from employee}
relate pub_id to pub_id) as rsemployees
简单把,呵呵。
这个还不算什么,要知道。如果当你的数据表中的
子表还有子表时,(这就是所谓的层状结构的记录集嘛)
使用data shaping技术你会发现更加的方便。这也是为什么
我在开始的时候说的该技术特别适用与oltp和企业级复杂的数据库开发的缘故了。
下面是一个两层子表的例子
shape {select * from publishers}
append (( shape {select * from titles}
append ({select * from sales}
relate title_id to title_id) as rssales)
relate pub_id to pub_id) as rstitles
其实,不仅可以在data shaping中使用sql语句,还可以使用存储过程的。
