4.3.1 E-R模型 为了把用户的数据要求清晰明确地表达出来,通常要建立一个概念性的数据模型(也称为信息模型)。概念性数据模型是一种面向问题的数据模型,是按照用户的观点来对数据和信息建模。它描述了从用户角度看到的数据,它反映了用户的现实环境,且与在软件系统中的实现方法无关。 内容来自www.paper51.com 在本系统数据表中用到的主键有: copyright paper51.com Ø 用户信息表中的用户编号:UserSN paper51.com
Ø 试题信息表中的编号:ID 内容来自www.paper51.com Ø 成绩信息表中的编号:UserSN paper51.com 4.3.2在本系统中使用ADO的过程及详解添加ADO数据源 paper51.com
本系统采用ADO来访问SQL数据库,这里充分应用了C++类封装的功能,根据本系统应用的范围,将访问数据库的功能函数封装在一个类CMyDatabase。 内容来自www.paper51.com
正如前所述,ADO是访问数据库的一个方法,它提供了不同的接口。ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。 _ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。 _CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。 _RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。 内容来自www.paper51.com 根据这些,我们将数据库的各种操作封装到CMyDatabase类里。几个主要函数说明如下: copyright paper51.com CMyDatabase::CMyDatabase() copyright paper51.com {//在构造函数中初始化三个接口 copyright paper51.com m_bInit=FALSE; http://www.paper51.com CString szMsg; http://www.paper51.com if(CoInitialize(NULL)== S_OK) 内容来自www.paper51.com { 内容来自www.paper51.com AfxMessageBox("CoInitializealready OK!"); 内容来自论文无忧网 www.paper51.com } http://www.paper51.com if(FAILED(m_pConnection.CreateInstance("ADODB.Connection"))) copyright paper51.com { paper51.com szMsg.Format("Create_ConnectionPtr Instance failed:(%d)!",GetLastError()); copyright paper51.com AfxMessageBox(szMsg); copyright paper51.com
return; copyright paper51.com } copyright paper51.com
if(FAILED(m_pRecordPtr.CreateInstance("ADODB.Recordset"))) copyright paper51.com
{ copyright paper51.com szMsg.Format("Create_RecordPtr Instance failed:(%d)!",GetLastError()); paper51.com AfxMessageBox(szMsg); http://www.paper51.com
return; copyright paper51.com } paper51.com if(FAILED(m_pCommand.CreateInstance("ADODB.Command"))) paper51.com { copyright paper51.com szMsg.Format("Create_CommandPtr Instance failed:(%d)!",GetLastError()); 内容来自www.paper51.com AfxMessageBox(szMsg); 内容来自www.paper51.com return; 内容来自论文无忧网 www.paper51.com } 内容来自www.paper51.com
m_bInit=TRUE; paper51.com } copyright paper51.com CMyDatabase::~CMyDatabase() 内容来自论文无忧网 www.paper51.com {//析构函数中释放 paper51.com m_pConnection.Release(); paper51.com m_pCommand.Release(); http://www.paper51.com
m_pRecordPtr.Release(); 内容来自论文无忧网 www.paper51.com } paper51.com BOOL CMyDatabase::Open(CString Database) paper51.com { http://www.paper51.com if(!m_bInit) paper51.com
{ 内容来自论文无忧网 www.paper51.com TRACE("Database:database init error"); 内容来自论文无忧网 www.paper51.com
returnFALSE; copyright paper51.com } 内容来自www.paper51.com CString strSRC; paper51.com strSRC.Format("Provider=Microsoft.Jet.OLEDB.4.0;DataSource='%s'", paper51.com Database); copyright paper51.com TRACE("%s\r\n%s",Database,strSRC); 内容来自论文无忧网 www.paper51.com _bstr_tbstrSRC(strSRC); 内容来自论文无忧网 www.paper51.com m_pConnection->CursorLocation=adUseClient;//游标类型 http://www.paper51.com try 内容来自论文无忧网 www.paper51.com { 内容来自www.paper51.com m_pConnection->Open(bstrSRC,"","",-1); copyright paper51.com } 内容来自www.paper51.com catch (_com_error&e ) { paper51.com CStringszMsg; copyright paper51.com szMsg.Format("%s",e.ErrorMessage()); copyright paper51.com AfxMessageBox(szMsg); copyright paper51.com returnFALSE; copyright paper51.com } paper51.com
return TRUE; 内容来自论文无忧网 www.paper51.com } 内容来自www.paper51.com BOOL CMyDatabase::Excute(CString Sql) copyright paper51.com {//执行 SQL语句 http://www.paper51.com _bstr_tbstrSql(Sql); copyright paper51.com m_pCommand->ActiveConnection=m_pConnection; http://www.paper51.com
m_pCommand->CommandText=bstrSql; http://www.paper51.com m_pCommand->CommandType=adCmdText; http://www.paper51.com
m_pCommand->Parameters->Refresh(); 内容来自论文无忧网 www.paper51.com try http://www.paper51.com { 内容来自论文无忧网 www.paper51.com m_pRecordPtr=m_pCommand->Execute(NULL,NULL,adCmdUnknown); 内容来自www.paper51.com
} paper51.com catch (_com_error&e ) { 内容来自www.paper51.com CStringszMsg; copyright paper51.com szMsg.Format("%s",e.ErrorMessage()); 内容来自论文无忧网 www.paper51.com AfxMessageBox(szMsg); copyright paper51.com returnFALSE; 内容来自www.paper51.com
} http://www.paper51.com return TRUE; 内容来自www.paper51.com } 内容来自论文无忧网 www.paper51.com
void CMyDatabase::Close() paper51.com { paper51.com try 内容来自论文无忧网 www.paper51.com
{ 内容来自www.paper51.com
if(m_pConnection) http://www.paper51.com { 内容来自www.paper51.com if(m_pConnection->State == adStateOpen) 内容来自www.paper51.com m_pConnection->Close(); paper51.com
} 内容来自论文无忧网 www.paper51.com
} paper51.com catch(_com_error &e) http://www.paper51.com { 内容来自www.paper51.com CStringszMsg; copyright paper51.com szMsg.Format("%s",e.ErrorMessage()); http://www.paper51.com AfxMessageBox(szMsg); http://www.paper51.com return; paper51.com
} 内容来自www.paper51.com } http://www.paper51.com BOOL CMyDatabase::IsEOF() http://www.paper51.com {//判断记录集是否为空 http://www.paper51.com if(m_pRecordPtr->GetadoEOF()) paper51.com
returnTRUE; 内容来自论文无忧网 www.paper51.com else paper51.com returnFALSE; 内容来自www.paper51.com } http://www.paper51.com CString CMyDatabase::GetValueByName(CString coName) http://www.paper51.com {//根据字段来取记录值 http://www.paper51.com _variant_t varValue; http://www.paper51.com _variant_tvarName(coName); copyright paper51.com
varValue =m_pRecordPtr->GetCollect(varName); 内容来自论文无忧网 www.paper51.com CStringValue=(char *)_bstr_t(varValue); 内容来自www.paper51.com
CCommon::Trim(Value); http://www.paper51.com return Value; 内容来自论文无忧网 www.paper51.com } paper51.com |