请大家打开CMS中的/CMS/Gen/UserClass/Class_News.asp
这里下载CMS:
http://www.nnhy.org/CMS/web/index.asp?Act=NewsDetail&NClassID=26&ID=63
我们先看看Class_News.asp中有什么
整个文件,就是一个NewLife_Class_News类
大家请看15到17行
以下是代码片段: Rem Public id, NClassID, NL_NClass_NClassName, Title, NewsKey, ComeFrom, PostTime, Author, Assessor, Hits, Remark, IsPicNews, PicPath, IsTop, Content Rem |
这里定义的每一个类全局变量,分别对应着数据库/CMS/Data/News.asa中的NL_News数据表的各个字段
这些全局变量的数据,对应数据表NL_News中的一行记录。
我们的ORM,要实现的功能有:添删改查 四大功能。
添加:在数据表NL_News中新增一条记录,把这些变量所保存的数据存入该记录对应的字段中。
删除:删除数据表中和这些变量对应的行。
修改:以id作为关键字,修改数据表NL_News中对应ID字段为id值的行,也就是保存关键字id以外所有变量的值到数据表中id所定位的行。
查询:从数据表中取出一个符合条件的记录行,并把各字段的数据赋值到同名的变量中;或者从数据表中取出符合条件的一批输出,进行模版运算后,直接输出。
TableName变量指明该类对应当数据表是NL_News
请大家看GetInfo方法。该方法实现了取一行记录到类的各字段变量的功能。
|
以下是代码片段:
Public Sub GetInfo() E.State = "取 文章"
If Con.DbType = DTOracle Then 'sql = "Select " & MulSelectStr & " From " & MulTableName & " Where rownum<2 And NL_News.NClassID=NL_NClass.id And NL_News.id=" & id & "" sql = "Select * From (Select " & MulSelectStr & " From " & MulTableName & " Where 1=1 And NL_News.NClassID=NL_NClass.id And NL_News.id=" & id & ") Where rownum<2" Else sql = "Select Top 1 " & MulSelectStr & " From " & MulTableName & " Where 1=1 And NL_News.NClassID=NL_NClass.id And NL_News.id=" & id & "" End If Set rs = Con.GetRs(sql,0) If not rs.eof Then Rem id = CInt("0" & Rs("id")) NClassID = CInt("0" & Rs("NClassID")) NL_NClass_NClassName = Rs("NL_NClass_NClassName") & "" Title = "" & Rs("Title") NewsKey = "" & Rs("NewsKey") ComeFrom = "" & Rs("ComeFrom") PostTime = "" & Rs("PostTime") Author = "" & Rs("Author") Assessor = "" & Rs("Assessor") Hits = CInt("0" & Rs("Hits")) Remark = "" & Rs("Remark") IsPicNews = CInt("0" & Rs("IsPicNews")) PicPath = "" & Rs("PicPath") IsTop = CInt("0" & Rs("IsTop")) Content = "" & Rs("Content") Rem Else E.ErrAdd "没找到数据", 1 End If rs.close End Sub |
E.State = "取 文章"
E.开头的代码,都是为了方便调试用的,不影响程序功能,大家可以略过
在调用GetInfo前,需要先对该对象的id变量复制,GetInfo才能取到由id定位的记录到各变量中
If Con.DbType = DTOracle Then
这个判断是为了兼容Oracle数据库
CMS是同时支持AC、MSSQL、Oracle等多种数据库的
Set rs = Con.GetRs(sql,0)
这是调用 Gen 的连接类的GetRs方法来获取记录集,sql参数就不说了,参数0表示尽是取数据,而不用修改数据,下面的Edit中将会看到1
再下面的赋值,大家都懂,就不多说了
类中,使用Add实现把变量中的数据写入数据表,原理与上面的GetInfo差不多一致,只是数据的方向不同而已
id行被注释了,没有使用,因为这是数据库的自增字段
Edit实现了修改数据的功能,同样是由id来定位记录。
Del实现了删除数据的功能,也是由id来定位要删除的记录,特别的是,Del支持批量删除记录,使用的是in语法。
Con是NewLife_Class_Conn类的对象,DBType是它的一个属性(变量成员),位于文件/CMS/Gen/Class/Class_Conn.asp中
Main方法,是类中最复杂的一个方法,因为它实现了批量获取数据,同时还要支持分页(分页还要兼容AC、MSSQL、Oracle等多种数据库),已经模块循环替换等多种功能
ORM的实现,到这里就完成了,大家获取发现,类中,还有不少函数和方法,是的,它们是扩展功能,包括和表单的映射。
也就是说,这个类,不仅实现了对象到数据库的映射,还实现了对象到表单单元的映射,使用编辑功能的时候,能够把各变量的数据自动赋值到对应当表单单元中,保存表单的时候,能自动把表单单元的数据接收到对应的变量中,再调用一次Edit方法,对象变量中的数据就进入数据库了。添加也是这个原理。这样大大方便了开发。
GetFromRequest负责接收表单单元的数据到对应的变量中
F.R是GetFromRequest的封装,用于强类型处理,在底层上解决SQL注入以及别的非法输入的问题。
比如:id = F.R("id", fNumber)第二个参数指明,现在要接收到是数字类型数据,如果是别的数据,一概返回空,这样,SQL注入就没有什么机会了。对于字符串型SQL注入,有个专门的类型fForSQL,它会过滤所有的危害性字符。欣慰的是,Gen中,不会使用接收来的字符串构造SQL,所以,可以说,Gen对SQL注入是绝对安全的,当然,如果外部跨越UserClass中的类来操作数据,那就另当别论了。
好了,今天的讲座就到此结束,谢谢大家
欢迎后天中午再来,Ajax讲座。
NewLife_Class_News类的实际使用,请看web/index.asp