MFC为我们提供了对于数据库操作的几个基本类:CDatabase, CRecordSet, CRecordView, CDatabaseException
我们要做的就是直接使用,这会大大减轻我们的编程负担:
1.首先建立数据库和表,例如使用SQL Server创建数据库test,并且建立几张表。完成后,在ODBC数据源管理中加入我们的这个数据库;
2.在Visual Studio中打开类向导,选择添加类->MFC ODBC Consumer,然后会选择数据源和数据库中对应的表,这样就快速建立了CRecordSet的派生类,每个CRecodSet类 都对应我们在数据库中的一张表,类名就是C+表面,类的数据成员就是表中的项。同时自动生成的还有DSN和连接字符串,这样我们在后面使用只需Open()就行了。
3.对数据库的实际操作,以具体代码为例:
void CDemoDlg::OnBnClickedButtonSavetodb()
{
UpdateData();
BOOL ifRoadAddSuccess;
int currentRecordNum = 0; //记录当前数据库中已有多少条记录作为RoadID,数字要加1
//道路数据不完整的时候则不用再继续进行下去了
if( m_strRoadName.IsEmpty() || m_strRoadWidth.IsEmpty() || m_strMaxSpeed.IsEmpty() )
{
AfxMessageBox(_T("道路数据不完整,无法操作,请检查!"));
return;
}
else
{
try
{
CDatabase db;
CMyRoad roadRecordSet;
if( roadRecordSet.Open() ) //打开数据集
{
//int currentRecordNum = 0; //记录当前数据库中已有多少条记录
while( !roadRecordSet.IsEOF() )
{
currentRecordNum++;
roadRecordSet.MoveNext();
}
//开始添加数据
roadRecordSet.AddNew(); //进入添加新纪录模式
roadRecordSet.m_RoadID = currentRecordNum+1;
roadRecordSet.m_RoadName = m_strRoadName;
int widthTemp,MaxSpeedTemp;
widthTemp = _ttoi(m_strRoadWidth); //CString to int
MaxSpeedTemp = _ttoi(m_strMaxSpeed);
roadRecordSet.m_Width = widthTemp;
roadRecordSet.m_MaxSpeed = MaxSpeedTemp;
roadRecordSet.m_PointsNum = m_ListControl.GetItemCount(); //ListControl里有多少行就有多少个点
//添加结束后更新记录集
roadRecordSet.Update(); //更新记录集
ifRoadAddSuccess = roadRecordSet.Requery();
//close recordSet and database
roadRecordSet.Close();
db.Close();
}
}
catch( CDBException* pe)
{
AfxMessageBox(pe->m_strError);
pe->Delete();
}
//最后给出操作是否成功的提示
if( ifRoadAddSuccess )
{
AfxMessageBox(_T("数据添加成功!"));
}
else
{
AfxMessageBox(_T("数据添加出现问题!"));
}
//重新赋值为空以便接受新的数据
m_strRoadName = "";
m_strRoadWidth = "";
m_strMaxSpeed = "";
}
}
其他的删除,修改操作类似,都是打开了CRecordSet后再根据不同需要进行操作。很简便吧?呵呵