在写完了php的数据库类之后,发现其实ASP也是可以做到数据库连接对象隐藏的!现在最主流的ASP写法都是将conn做为全局变量。以前封装的几个类也或多或少的用到了conn对象。也就是在配置文件里必须有一个 conn的全局变量,我们需要的时候用 link_database() 来给conn赋值,然后在页面的结尾都需要显示的conn.close();通常我们在每个页面的结尾加上如下代码:
if isobject(conn) then conn.close:set conn=nothing
这样做存在什么问题呢?不优美了!相比自己写的PHP类,显得耦合度很高,我竟然需要用到全局变量来控制数据库操作!有没有更好的方法呢?以前也想过,不过最后因为过度封装反而影响了开发的速度,结果还是回到最原始的conn全局变量的写法来。其实要100%封装ASP的数据库操作是完全可以的!下面先来看下我们理想的写法。数据库更新删除添加我就不写了,没什么好说的,我们可以做到。要封装最麻烦的是和分页结合在一起的部分。如果我用调用PHP数据库操作类的写法应该如下:
Set objConn=New DBClass ‘建立一个新的对象
objConn.Connection() ‘连接数据库
objConn.PageSize=20 ‘一页显示20条
objConn.Execute(”select * from T”) ‘传入select语句,自动判断是查询还是更新
‘以下是循环读取数据
while(objConn.Read())
Response.write objConn.Get(”ID”) & “ ”
Response.write objConn.Get(”test”) & “<br />”
Wend
objConn.ShowPage() ‘分页导航
看上面的写法多么优美!我们没有任何的连接数据库的对象。我们希望不需要写conn.close(),只要页面销毁对象的时候自动关闭数据库连接,我们希望不需要考虑页面的参数,ShowPage() 已经帮我们完成了。我们也不希望去考虑数据如何传递,我们只需要简单的Get就可以获得我们想要的数据。想想,如果能这样,我可以用VB去封装一个数据库操作的类,我可以直接用 Set objConn=Server.Create(”DBClass”) 来生成一个对象,VB是编译好了的,性能肯定很高。这样的写法能做到吗?答案是肯定的!完全可以通过ASP有限的面向对象特性封装成一个这样的类。
首先我们分析下,这个类我们需要将conn,rs等 传统的东西都包含进去。也就是我们在调用Connection方法的时候就得产生一个conn对象,当然这个对象是类里面私有的。然后我们在给PageSize赋值的时候,我们的对象就知道接下来是要进行分页操作了!当执行Execute的时候,我们同样也判断是否是select 语句,如果是,则产生一个rs对象,这个rs肯定也是私有的。那如何得到值呢?以前一直被rs(”id”)这种方式误导了,认为要构建一个数据库操作类,应该和C#那样objConn(”ID”)来得到,其实应该是用类里面的一个方法,暂且我们定义为Get(str) 我们可以将Get映射到 rs(str) 里面来,这样就可以在外部得到想要的一切数据了。好,还有另外的情况!rs.movenext呢?我们需要控制游标下移啊。在这里我用类似.net 里面的Read()方法来完成。其实很好做,反过来,如果是第一条记录,直接给返回true。如果不是第一条记录,怎么办呢?控制rs.movenext()嘛。这样我们的写法不就和.net里面统一了吗? 所以通过Get完全可以获得我们想获得的任何记录。至于分页,能顺利进行吗?答案是肯定的!其实一个分页函数只和2个变量有关!第一个是最大值,第2个是一页显示多少条记录。而至于当前页,完全可以通过全局的request对象获得参数值。第1个最大值,可以调用rs的recodcount得到,一页显示多少条,前面的变量已经赋了。所以分页也可以解决!
通过以上的分析一个优美的数据库操作类就完成了。这个类我们完全可以独立运行,不需要任何所谓的全局conn对象。而且非常健壮,在类撤销的时候,会自动关闭数据库连接。
到了上面的分析,基本上解决了问题,但是有一个问题:海量数据的分页!肯定不能用rs来分页,如果超过10万条,都放到内存,还不慢死!可惜sqlserver和access 都不支持limit,支持该多少好啊。当然不支持不意味着不能实现高性能的分页。获得记录条数,还是改造select语句,将其改造为 select count(*)。而取得数据记录用 排除法,select top not in 这种方法来实现。当然这里的改造select 语句可比mysql的要复杂得多啊,毕竟是将一条select 语句改造成一条复合语句。以前封装C#的数据库操作类的时候已经封装了一个,相信看看以前的代码处理起来会比较简单。当然类里面肯定得做开关来支持海量数据分页。
至此,这个数据库操作分页类就分析完毕了,至于代码,暂不公布,还没写完,这种方式还是昨天坐车的时候想到的。写了这么久的程序,接触了VB,VC++,C#,Java,ASP,到前段时间接触的PHP,可谓各大主流的编程语言都过了一遍了。越来越深刻的感觉到,任何一种语言其实都可以写得很优美!任何一种语言都可以提高可复用性,提高健壮性。
其实我还感觉ASP还可以实现更多的面向性。因为ASP有个很有用的函数:execute .将字符串当表达式执行!以前一直是用来表单给rs赋值用的。也许在这个数据库操作类里面我们可以加入更新,添加的部分。用execute语句可以像这样来更新数据:objConn.Form2Rs(”ID,UserName,Password,TX”) 只要这样一写,表单的值就全跑到数据库去了。当然必须Form名和数据库字段名对应!
其实有时候想来,编程和设计其实并没有区别,让代码看起来更优美,更简单是不断追求的。
