做了一个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;
}

解决方案 »

  1.   

    如果记录集为空,是否还可以MoveFirst?俺看你的代码好像没加判断~
    另外,最好看看具体错误是啥,加上:try
    {
       //带测试code
    }
    catch(_com_error& e)
    {
       AfxMessageBox(e.Description());
    }
      

  2.   

    网上别人说的,没试过:
    据说是野指针导致的,在release下系统帮你解决了这个问题,但debug是报错的,打开"编译"->"配置"->"把里面除了release其他的选项全部删除,再重新build就可以了~
      

  3.   

    客户端游标的问题
    把rs.Open(CRecordset::forwardOnly,strSql); 改成rs.Open(CRecordset::snapshot,strSql); 
      

  4.   

    我觉得这样改应该有道理,但是改成任何非forwardOnly项,虽然编译链接通过,但是在执行到这一句时都会直接引发DEBUG ERROR出错提示框,导致程序中断退出
      

  5.   

    这样做确实可以让程序不再显示这个出错对话框,但是实际上程序依然会出错,程序在显示了一行abnormal program termination时就退出了
      

  6.   


    弱弱的问下,这个catch里面的_com_error类型是在哪里定义的啊?加上它编译不通过,因为未找到_com_error的定义。我的头文件是:
    #include<afxdb.h>
    #include<iostream.h>
    #include <afx.h>
      

  7.   


    if(db.Open(NULL, FALSE, FALSE, strConnect))这句错了,换成if(db.OpenEx(strConnect))
      

  8.   


    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;
    }
      

  9.   

    是StdAfx.h里面的,MFC向导建的项目一般都带~
      

  10.   


    哦,学习了。之前没用过try的说。不过我建的只是个Consle程序,不是MFC的。
      

  11.   


    非常非常感谢大神,一天半的纠结终于结束了!各种断言错误在换了openex函数后都消失了!我就不知道为什么自己当初看到openex函数后就没换下试试呢!否则就不用纠结至此了。不过最后还想让大神解释一下,为什么用open是错的呢?我们的教材上用的就是open呢。
      

  12.   


    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直接用字符串连接。