void CSTUDENTDlg::OnBUTTONsum() //求总分及平均分
{
// TODO: Add your control notification handler code here
m_list_student.DeleteAllItems();//m_list_student为列表框对象
CString sq,sql;
sq="Provider=SQLOLEDB.1;Password=121314;Persist Security Info=True;User ID=gogogo;Initial Catalog=student;Data Source=9A729FB3EBB243C\\SQLDB";
CDStrs acFields;
//typedef ::std::vector<CString>CStrs;
//typedef ::std::vector<CStrs>CDStrs;
if(!g_ad.Open(sq))//g_ad为CADODB类对象
{
AfxMessageBox("数据库未打开");
return;
}
sql.Format("SELECT grade,class,id,name, english, math, chinese,"
"english+math+chinese AS summark, (english+math+chinese)/3 AS average FROM student");
g_ad.ExecuteQuery(sql,acFields);//调用ADO封装数据库的一个CADODB类的成员函数
for(int i=0;i<acFields.size();i++)
{
CStrs strs=acFields[i];
Inserstudent(&m_list_student,strs[0],strs[1],strs[2],strs[3],strs[4],strs[5],strs[6],
strs[7],strs[8]);
//在列表框中显示用acFields存处的数据库信息,平均分和总分可以求出来并在列表框显示出
//但在数据库中却没有改变
}
}
//以下部分代码是用ADO封装数据库的一个CADODB类
BOOL CADODB::IsOpen()//判断数据库是否处于打开状态
{
try
{
return (m_pConn!=NULL &&(m_pConn->State & adStateOpen));
//_ConnectionPtr m_pConn; 在CADODB头文件中定义的
}
catch(_com_error e)//异常处理
{
AfxMessageBox(e.ErrorMessage());
}
return FALSE;
}
_RecordsetPtr CADODB::Execute(LPCTSTR strSQL,long lOptions)
{
_variant_t RecordsAffected;
try
{//执行SQL语句
return m_pConn->Execute(_bstr_t(strSQL),&RecordsAffected,adCmdText);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
return FALSE;
}
bool CADODB::Open(LPCTSTR lpszConnect,long lOptions)//打开数据库连接
{
m_pConn.CreateInstance("ADODB.Connection");//创建Connection对象
//初始化Recordset指针
m_pRs.CreateInstance(_uuidof(Recordset));
//_RecordsetPtr m_pRs; 在CADODB头文件中定义的
m_strConn=lpszConnect;
if(m_strConn.IsEmpty())
{
return FALSE;
}
if(IsOpen())
Close();
try
{
//连接数据库
return (m_pConn->Open(_bstr_t(m_strConn),"","",lOptions)==S_OK);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
return FALSE;
}
void CADODB::Close()//关闭数据库连接
{
try
{
if(m_pConn!=NULL && IsOpen())
m_pConn->Close();
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}
void CADODB::ExecuteQueryValue(LPCTSTR lpszSQL,CString& value)//根据SQL语句查询数据库,获取的记录集保存在二维字符串数组中
{
try
{
//打开记录集
m_pRs->Open(_bstr_t(lpszSQL),(IDispatch*)m_pConn,adOpenDynamic,
adLockOptimistic,adCmdText);
if(!m_pRs->adoEOF)
{
_variant_t thevalue=m_pRs->GetCollect(_variant_t((short)0));//获取字段值
value=vartostr(thevalue);
}
m_pRs->Close();
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}
void CADODB::ExecuteQuery(LPCTSTR lpszSQL,CDStrs& Fields)//根据SQL语句查询数据库,获取一个字段值
{
try
{
//打开记录集
m_pRs->Open(_bstr_t(lpszSQL),(IDispatch*)m_pConn,adOpenDynamic,
adLockOptimistic,adCmdText);
while(!m_pRs->adoEOF)
{
CStrs strs;
_variant_t thevalue;
//获取一条记录中的所有字段值保存到字符串数组strs中
int size=m_pRs->Fields->Count;
for(long index=0;index<m_pRs->Fields->Count;index++)
{
thevalue=m_pRs->GetCollect(_variant_t(index));
CString temp=vartostr(thevalue);
strs.push_back(temp);
}
Fields.push_back(strs);
m_pRs->MoveNext();
}
m_pRs->Close();
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}
以下是在SQL中定义的数据类型
grade int 4
class varchar 50
id varchar 50
name varchar 50
english float 8
math float 8
chinese float 8
summark float 8 (可为空)
average float 8 (可为空)