1.用ODBC连接mysql
右键空白部分-》类向导-》添加类-》MFC ODBC使用者-》数据源-》机器数据源-》新建-》用户数据源(点击下一步)-》Mysql ODBC Unicode Driver-》完成
出现下图:
填写数据,点击test。连接成功选择OK。
再选择你刚填写的数据库,点击OK;出现下图,选择你要连接的表,确定,完成
出现该错误(fatal error C1189: #error : 安全问题:连接字符串可能包含密码。)请//
2.代码1
说明1:LG.nID是char数组;pSet是在CxxxDlg.h的类中加入数据库类实例
说明2:下面这种方法只用于查询(select)
if (pSet->IsOpen())
pSet->Close();
//如果记录集打开,则先关闭
CString temp(LG.nID);
pSet->m_strFilter.Format(L"id='%s'",temp);//相当于where后面的条件
//id是usres表的字段名,用来指定查询条件
pSet->Open();//里面没有参数就使用m_strFilter;有参数就不能有m_strFilter
if (!pSet->IsEOF()) // 如果打开记录集有记录
{
//pSet.GetFieldValue( L"password" , varPassword );
//pSet.MoveNext();
//MessageBox(L"找到账号");if (pSet->m_password == LG.nPWD){//执行代码}else{//执行代码}}else{//执行代码}
代码2:
说明:用于插入、更新、删除
CString query;
query.Format(L"insert into users values (\"%s\",\"%s\");", id, password);
CDatabase db;
Cusers sj;//Cusers是odbc生成的数据库类名
CString lj = sj.GetDefaultConnect();
if (!db.IsOpen())//判断数据库是否已经被打开
{
BOOL bflag = db.Open(NULL, false, false, lj);//连接数据库
if (!bflag)
{
MessageBox(L"打开数据库失败!\n请重启!");
return;
}
}
try
{
db.ExecuteSQL(query);
}
catch (CDBException *e)
{
e->ReportError(); //报告异常原因,如主键异常
e->Delete();
db.Close();
return;
}
catch (CMemoryException *e)
{
MessageBox(L"数据库内存异常!");
e->Delete();
return;
}
catch (...)
{
MessageBox(L"数据库其它异常!");
return;
}
db.Close();
问题:odbc不支持动态集等:
修改open()第一个参数。
定义CRecordset对象,调用其Open方法打开记录集,如
CRecordset rs(&m_db);
virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none);
参数一为打开类型,如下:
AFX_DB_USE_DEFAULT_TYPE:默认值
CRecordset::dynaset:动态记录集,支持双向游标,并保持同所连接的数据源同步,对数据的更新操作可以通过一个fetch操作获取。
CRecordset::snapshot:静态快照,一旦形成记录集,此后数据源的所有改变都不能体现在记录集里,应用程序必须重新进行查询,才能获取对数据的更新。该类型记录集也支持双向游标。
CRecordset::dynamic:同CRecordset::dynaset记录集相比,CRecordset::dynamic记录还能在fetch操作里同步其它用户对数据的重新排序,大部分ODBC驱动程序不支持这种记录集 。
CRecordset::forwardOnly:除了不支持逆向游标外,其它特征同CRecordset::snapshot相同。
参数二为sql查询语句,查询结果保存在记录集中
参数三指定创建记录集时的常用选项
CRecordset::none:无选项(缺省),与其它所有选项互斥,可以更新、删除、添加记录
CRecordset::appendOnly:不允许修改和删除记录,但可以添加记录.
CRecordset::readOnly:记录集是只读的.
**错误**:“MFC internal error: unable to load error string from resource.”
说明mfc中连接了多张表,其中某些表缺少 virtual BOOL Requery();和virtual BOOL Open(UINT nOpenType = snapshot, LPCTSTR lpszSql = NULL, DWORD dwOptions = none);
解决方法:VS中某一张表-》类向导-》虚函数-》添加 Requery和Open
相关材料:
CRecordset类的常用成员函数 成员变量 以及操作实例
CRecordset api介绍