各位老大:我在线等了三天都没解决这个问题,我不相信我找不到结果,所以再来100分请教!请问,怎么在对Visual FoxPro的".dbf"数据库中,对加了删除标志的记录进行彻底删除?我查了CRecordset好象没有Pack成员函数啊!
代码:SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Visual FoxPro Driver","DSN=data\0Description=data\0SourceType=dbf\0Source=e:\\conv\0");m_database.Open(_T("data"));data.m_pDatabase=&m_database;data.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT * FROM  pdaa1" ,CRecordset::none);删除记录的时候我用:m_database.ExecuteSQL(_T("delete from pdaa1"));  而这只是加上删除标记m_Database.ExecuteSQL(_T("pack"));
可是这时运行就提示:“File must be opened exclusively”而没有彻底删除。前面一个帖也有100分,还没结,我可以一起给分~!

解决方案 »

  1.   

    接昨天的:
    “File must be opened exclusively”,到底是运行到哪一句(具体的一句),报的错,你始终没有回答。
      

  2.   

    还有,既然是删除时的问题,而且一直得不到解决,调试时就应该纯粹一点,即把其它没有用的代码先注释掉。比如,完全没有必要调用select语句,这样会给定位bug带来困难。
      

  3.   

    再者,SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Visual FoxPro Driver","DSN=data\0Description=data\0SourceType=dbf\0Source=e:\\conv\0"); 只需要调用一次,这样写程序有问题。
      

  4.   

    TO pcman1990(pcman) :跟踪以后,发现是运行到
    m_database.ExecuteSQL(_T("pack"));后,跳到以下:
    CATCH_ALL(e)
    {
    lResult = AfxGetThread()->ProcessWndProcException(e, &pThreadState->m_lastSentMsg); //就到了这里,出现那个提示的 TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",
    lResult);
    DELETE_EXCEPTION(e);
    }
    END_CATCH_ALL
      

  5.   

    打开数据库以后(用exclusive模式),试试不调用select语句,直接调用delete和pack呢?
      

  6.   

    还有,你原来的程序中,recordset open以后有没有close?
      

  7.   

    > 还有,你原来的程序中,recordset open以后有没有close?
    即:data.Open(......)后有没有调用data.Close();?
      

  8.   

    现在代码是:
    m_database.OpenEx("DSN=data", CDatabase::openExclusive);
    data.m_pDatabase=&m_database;
    //data.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT * FROM pdaa1" ,CRecordset::none);
    m_database.ExecuteSQL(_T("pack"));
    就这么多了。可是,运行到m_database.OpenEx("DSN=data", CDatabase::openExclusive);时就会报错:“0x6bc85280"引用的"0x000000008"内存,该内存不能为"read"
    如果我用m_database.Open(_T("data"));而不是OpenEx()的时候,再加上后面的SELECT *时,就可以继续运行了
      

  9.   

    m_database.Open(_T("data"));要改为m_database.Open(_T("data"), TRUE);
      

  10.   

    加上TRUE后,我在DEBUG 和 RELEASE下都执行过DEBUG就报错:“DEBUG ASSERTION FAILED……”提示“终止”“重试”“忽略”
    RELEASE则报:“File must be opened exclusively”
      

  11.   

    ASSERT报的是什么文件,哪一句?(按“重试”可以找到)
      

  12.   

    还有,ASSERT错时,你的程序中有是运行到了哪一句?(打开call stack可以看)
      

  13.   

    按“重试”后,直到:
    m_database.ExecuteSQL(_T("pack"));都没问题,然后跳转到:CATCH_ALL(e)
    {
    lResult = AfxGetThread()->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);//运行到这里时显示::“File must be opened exclusively” TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",lResult);
    DELETE_EXCEPTION(e);
    }
    END_CATCH_ALL后面都还好
      

  14.   

    创建ODBC时,用(独占)exclusive模式
      

  15.   

    还有,ASSERT错时,你的程序中有是运行到了哪一句?(打开call stack可以看)
      

  16.   

    不是这个意思,关键是ASSERT到底报的什么,你程序中的哪一句引起ASSERT的。
    你得好好学学debug。
      

  17.   

    其实在vfp中的一些命令和forpro中一样可以在你确定要删除时用pack即可
      

  18.   

    call stack是什么?怎么用?我是加断点查的,ASSERT报错是在这一句:m_database.Open(_T("data"), TRUE);
      

  19.   

    我调了CALL STACK了,可是我不会用,一步步走的全是机器码