在MFC中,有CDatabase类可以操作数据库。
首先要引入头文件:#include <afxdb.h>
然后创建一个类:
CDatabase mdb;或者CDatabase *mdb = new CDatabase;
然后连接数据库,我这里有一个自己封装的现成的函数:
BOOL OpenDB(CDatabase *mdb)
{
if (mdb->IsOpen()) {
mdb->Close();
}
try {
BOOL result = mdb->Open(_T("server"), FALSE, FALSE, _T("ODBC; UID=server; PWD=kTc"));
if (!result) {
AfxMessageBox("连接数据库失败,请检查数据库后再点确定");
}
return result;
} catch (CDBException* pEx) {
CString msg;
msg.Format("连接数据库失败!%s", pEx->m_strError);
writeLog(msg);
pEx->Delete();
}
return FALSE;
}
mdb->Open其中第一个参数是odbc的名称,第二个参数必须为FALSE(见MFC文档),第三个参数是否为只读,第四个参数为该数据库的用户名和密码。配置ODBC数据源的方法请自行百度,需要说明的是,最好在数据源配置里设置好切换到某个数据库,省得代码里还要调用ExecuteSQL切换。
读取记录方法
int id;
CString username;
CRecordset rs(mdb);
try {
int result = rs.Open(CRecordset::forwardOnly, _T("select id,username from user where username = 'admin'"));
if (!result || rs.IsEOF()) {
if (result) rs.Close();
return maxId;
}
CString strValue = _T("0");
rs.GetFieldValue((short)0, strValue);
rs.GetFieldValue((short)1, username);
id= _ttoi(strValue);
rs.Close();
} catch (CDBException* pEx) {
pEx->ReportError();
pEx->Delete();
}
执行SQL语句(增加、修改、删除均可)
try {
mdb->ExecuteSQL("update user set password='admin' where id=1");
mdb->ExecuteSQL("delete from user where id=1");
mdb->ExecuteSQL("insert user (id, username, password) values ('1', 'admin', 'admin')");
return TRUE;
} catch (CDBException* pEx) {
CString msg;
msg.Format("数据库未连接,尝试重连:%s\n", pEx->m_strError);
TRACE(msg);
pEx->Delete();
return OpenDB(mdb);
}
注意:rs对象在执行某个查询过程中,不能启动另一个查询。