学生考试管理系统ADO版
2008-04-19 20:27:52 来源:WEB开发网三. 编程实现部分
主要考虑了以下几个方面:
1.基本表数据的录入
只有输入班级信息,年级信息等一些基础信息后,系统才可以进行其它,如考试信息的管理,那么怎样录入这些基础数据,如果一表建一类的话(这样做最好),如果基础表太多,这样系统编程工作量就会增加,所以想了想,能不能让系统根据数据库的关联关系去选择外键字段然后生成输入界面,再根据用户操作生成sql语句,去更新数据库,如添加记录。如图四所示:
图四 添加记录
图五 添加记录
图四中的年级编号在年级表中索引得到;图五中的班级编号在班级表中索引得到,课程编号在课程表中索引得到,该怎么做?
(1)、数据库结构方面:参考了用友数据库的一些表的设计,然后就想把数据表<表说明>中增加了字段:外键个数,字段0,外键0,外部表0,显示字段0…..字段n:(现在数据库预设计为一个表可以最多有4个外键)。
(2)、程序类方面:设计了一个记录字段信息(CFieldRecord)以及一个基本表类(CBaseTbl):
//记录信息量
struct CFieldRecord
{
char FieldName[20];//字段名(如果为外键字段,则为显示字段)
char Value[255]; //值
bool IsBool; //是否布尔
bool IsStrType; //是否字符串
bool IsVisible; //是否显示
char DisplayName[20]; //对应ID值(用于外键)
char FKtbl[20]; //外键表名或基本表名
CFieldRecord* pFK; //外键信息
};
//基本表的处理
class CBaseTbl : public CObject
{
public:
CBaseTbl();
virtual ~CBaseTbl();
CList<CString,CString&> m_TblList;//名称列表
void GetTblnames();
//单表记录数组,默认记录最后一条
bool GetFieldRecord(CPtrArray& FieldArray,CString ctblname,CString constr="");
bool RemoveRecord(int CurRecordPos);
protected:
CADOStorage m_Storage;
//单表记录数组,默认记录最后一条
void AddExtraFieldRecord(CPtrArray& FieldArray,CString ctblname);
private:
CString m_TblName;
public:
//选择联合表
bool SelectUnionTbl(CString StrTblname,CString& Realtbl,bool ByRealTblName=false);
void RefreshList(CListCtrl& List1);
void ReQuery(CString TblName);
void ExecSql(CString SqlStr);
};
(3)、如在基本表视中点击添加数据过程:
①、调用过程:
//选择添加记录
void CStudentScoreView::OnADDRecord()
{
ASSERT(this->m_hWnd);
CBMDialog dialog1;
CStudentScoreDoc* pDoc=this->GetDocument();
pDoc->m_BaseTblList.GetFieldRecord(dialog1.RecordArray,this->m_CurTblName);
dialog1.ISADD=true;
dialog1.m_hParent=this->m_hWnd;
dialog1.m_OprTblName=this->m_CurTblName;
if(dialog1.DoModal()==IDOK)
{
AfxMessageBox("添加记录!");
//ASSERT(dialog1.m_hWnd);
}
}
申明为:文档类中 CBaseTbl m_BaseTblList;//表信息实例
对话框类中 CPtrArray RecordArray;//字段数组(用于保存字段的类型及外键信息)
传递参数:表名 this->m_CurTblName,
是否添加信息:dialog1.ISADD=true;
视的句柄的 Dialog1.m_hParent=this->m_hWnd;
以及最关键的一个量 dialog1.RecordArray(this->m_CurTblName 的记录及外键信息)
进行初始化后传递给窗体类CBMDialog;
更多精彩
赞助商链接