本系统结合了asp技术和com+技术,是一个三层结构。表示层由asp页面组成,用以实现web页面显示和调用com+组件,业务逻辑和数据访问由一组用vc实现的com+组件构成。为了便于维护、升级和实现分布式
应用,在实现过程中,又将业务逻辑层和数据访问层分离开,asp页面不直接调用数据访问层,而是通过业务逻辑层来调用数据库。
该系统的实现主要分为三个部分:数据库、com+组件和asp页面。其中数据库与asp页面的实现与一般b/s结构的web应用相似。com+实现可分为三个步骤:com+组件的设计、com+应用程序的生成和组件注册、基于属性编程。该管理系统利用vc中的atl开发com+组件。下面是该系统中一个定制组件部分主要代码
在showscore.asp页面中接受、辨别用户的查询请求,做出不同的查询处理。当客户的身分为教师或教务员时,可以查询所有学生的成绩;当客户的身分为学生时,只能查询本人的成绩。
定制com组件score.dll进行查询处理。首先设计该组件的接口,为组件设计四个属性:subjno(课程号),term(课程所属学期),classno(班级号)和stuno(学号)。定义两个
方法requeryscores和requeryallscores,分别对教师、教务部门和学生的请求做出相应的处理,并将查询结果集返回给用户。
以下是实现该组件score.dll接口描述以及实现
方法的部分代码,从中可以看到组件的接口是如何实现的:
import "ocidl.idl";
[
object,
uuid(46c01798-be39-4fc0-a25d-718ba31dfadc),
dual,
helpstring("istudentscore interface"),
pointer_default(unique)
]
interface istudentscore : idispatch{
[propget, id(1), helpstring("课程号")] hresult subjno([out, retval] bstr *pval);
[propput, id(1), helpstring("课程号")] hresult subjno([in] bstr newval);
//其它接口部分从略
[id(5), helpstring("method requeryscores")] hresult requeryscores(([out,retval]lpdispatch* pprecordset));
};
stdmethodimp cstudentscore::requeryscores()
{
hresult hr=s_ok;
iobjectcontext* m_spobjectcontext=null;
//利用ado访问数据库
::coinitialize(null);
_recordsetptr precordset=null,precordsetclone=null;
bstr bstrdsn=::sysallocstring(l"provider=sqloledb.1;persist security info=true;
password=;initial catalog=pubs;data source=zhudamiing;user id=sa");
bstr bstrsql;
try{
getobjectcontext(&m_spobjectcontext);
precordset.createinstance(__uuidof(recordset));
//根据查询要求(查询所有课程、查询特定学期所有课程、查询指定课程、查询
//特定学期某一课程)进行不同操作生成相应sql语句,程序具体处理从略