做了一个ODBC操作ACCESS注册表的程序,编译链接都没错误,而且程序之前的读取是没有问题的,但是在执行MoveFirst函数时候报错:Assertion Failed!File:afxwin1.inl line:22.忽略后还会出现错误:Debug Assertion Failed! File:dbcore.cpp Line:66 求教各路大神~!!1
BOOL ODBCConnect(CString &strDBFile)
{
CString strConnect;
strConnect.Format(_T("ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb)};UID=admin;PWD=admin;DBQ=%s"), strDBFile); CDatabase db;
if(db.Open(NULL, FALSE, FALSE, strConnect))
{
int iCounter = 0;
//连接数据库成功
cout << "数据库已经连接陈功!" << endl;
CRecordset rs(&db);
CString strSql;
strSql = _T("select * from t_student"); //SQL语句
rs.Open(CRecordset::forwardOnly,strSql); //执行Sql语句(可添加 删除 查询等)
if(rs.IsOpen())
{
cout << "记录集已开启" << endl;
// CDBVariant variant;
CString variant;
// rs.MoveFirst();
cout << "已移动到首位!" << endl;
while(!rs.IsEOF())
{
//读取记录
cout << "开始读取" << endl;
rs.GetFieldValue((short)0, variant);
cout << variant;
rs.GetFieldValue((short)1,variant);
cout << "\t" << variant;
rs.MoveNext();
}
if (rs.IsEOF())
{
rs.MoveFirst();
}
} rs.Close();
db.Close();
return TRUE;
}
return FALSE;
}
BOOL ODBCConnect(CString &strDBFile)
{
CString strConnect;
strConnect.Format(_T("ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb)};UID=admin;PWD=admin;DBQ=%s"), strDBFile); CDatabase db;
if(db.Open(NULL, FALSE, FALSE, strConnect))
{
int iCounter = 0;
//连接数据库成功
cout << "数据库已经连接陈功!" << endl;
CRecordset rs(&db);
CString strSql;
strSql = _T("select * from t_student"); //SQL语句
rs.Open(CRecordset::forwardOnly,strSql); //执行Sql语句(可添加 删除 查询等)
if(rs.IsOpen())
{
cout << "记录集已开启" << endl;
// CDBVariant variant;
CString variant;
// rs.MoveFirst();
cout << "已移动到首位!" << endl;
while(!rs.IsEOF())
{
//读取记录
cout << "开始读取" << endl;
rs.GetFieldValue((short)0, variant);
cout << variant;
rs.GetFieldValue((short)1,variant);
cout << "\t" << variant;
rs.MoveNext();
}
if (rs.IsEOF())
{
rs.MoveFirst();
}
} rs.Close();
db.Close();
return TRUE;
}
return FALSE;
}
另外,最好看看具体错误是啥,加上:try
{
//带测试code
}
catch(_com_error& e)
{
AfxMessageBox(e.Description());
}
据说是野指针导致的,在release下系统帮你解决了这个问题,但debug是报错的,打开"编译"->"配置"->"把里面除了release其他的选项全部删除,再重新build就可以了~
把rs.Open(CRecordset::forwardOnly,strSql); 改成rs.Open(CRecordset::snapshot,strSql);
弱弱的问下,这个catch里面的_com_error类型是在哪里定义的啊?加上它编译不通过,因为未找到_com_error的定义。我的头文件是:
#include<afxdb.h>
#include<iostream.h>
#include <afx.h>
if(db.Open(NULL, FALSE, FALSE, strConnect))这句错了,换成if(db.OpenEx(strConnect))
BOOL ODBCConnect(CString &strDBFile)
{
CString strConnect;
strConnect.Format(_T("ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb)};UID=admin;PWD=admin;DBQ=%s"), strDBFile); CDatabase db;
try
{
if(db.OpenEx(strConnect))
{
int iCounter = 0;
//连接数据库成功
cout << "数据库已经连接陈功!" << endl;
CRecordset rs(&db);
CString strSql;
strSql = _T("select * from t_student"); //SQL语句
rs.Open(CRecordset::snapshot,strSql); //执行Sql语句(可添加 删除 查询等)
if(rs.IsOpen())
{
cout << "记录集已开启" << endl;
// CDBVariant variant;
CString variant;
// rs.MoveFirst();
cout << "已移动到首位!" << endl;
while(!rs.IsEOF())
{
//读取记录
cout << "开始读取" << endl;
rs.GetFieldValue((short)0, variant);
cout << variant;
rs.GetFieldValue((short)1,variant);
cout << "\t" << variant;
rs.MoveNext(); }
if (rs.IsEOF())
{
rs.MoveFirst();
}
}
}catch(CDBException &e)
{
e.ReportError();
} rs.Close();
db.Close();
return TRUE;
} return FALSE;
}
哦,学习了。之前没用过try的说。不过我建的只是个Consle程序,不是MFC的。
非常非常感谢大神,一天半的纠结终于结束了!各种断言错误在换了openex函数后都消失了!我就不知道为什么自己当初看到openex函数后就没换下试试呢!否则就不用纠结至此了。不过最后还想让大神解释一下,为什么用open是错的呢?我们的教材上用的就是open呢。
virtual BOOL Open(
LPCTSTR lpszDSN,
BOOL bExclusive = FALSE,
BOOL bReadOnly = FALSE,
LPCTSTR lpszConnect = _T("ODBC;"),
BOOL bUseCursorLib = TRUE
);
virtual BOOL OpenEx(
LPCTSTR lpszConnectString,
DWORD dwOptions = 0
);两个函数是用法是不一样的。Open要先建立DSN,OpenEx直接用字符串连接。