使用ODBC进行数据库编程时,该类是由CRecordset而来,当该记录集类的数据记录太多时(大于40万条),那么在运行Open()后,再运行AddNew(),Update(),则系统陷入了漫长的等待(大概10分钟),请问有没有办法解决?         mySet->Open(AFX_DB_USE_DEFAULT_TYPE,NULL,CRecordset::none); mySet->AddNew();
mySet->m_id = "12342134";
mySet->Update();    // 就是在这一步,耗用的时间特别长

解决方案 »

  1.   

    用CDatabase类操作:
    CDatabase * pDatabase = new CDatabase;
    CString Sql;
    Sql.Format("DSN=ODBCName;UID=***;PWD=***");
    pDatabase->OpenEx(Sql, 0 );SQL.Format("Insert into TableName (id, ...) values (1213, ....)");
    pDatabase->ExecuteSQL( SQL );
    pDatabase->Close();
    delete pDatabase;
      

  2.   

    to jnxulei(石头) 
    由于这是别人的程序,如果要改成这样,那改动的地方太多了,有没有别的办法?
    我一直在想,是不是Open()将所有数据记录都返回来,由于ODBC做了优化,因此在Open()是没有表现出慢,而是在数据集改变时,即AddNew或是Update时才表示出来。能不能在Open时使用SQL条件将该表数据少选一点,或是根本不选。这个程序不需要查询数据,只需要添加。
      

  3.   

    我试过
    mySet->m_strFilter = "id = -1";
    或是
             mySet->Open(AFX_DB_USE_DEFAULT_TYPE, "select * from mytable where id = -1", CRecordset::none);在进行Update()时,总是提示错误,有“字符串是右截位...”,“日期出错”等,但没有不加这些,则一切正常。
      

  4.   

    steedhorse(晨星) 老大,这种方法试过了,但在Update()时,系统报错,如果是“0=1”这样的条件,系统报字符串右截位错,如果使用该表中的一个字段等于永不可能等的值如id=-1,则系统在处理日期时间字段时出错,但实际上,该表我只赋了一个字段的值,该字段是字符串型的,该表没有一个字段是不允许空,因此到底错在哪我还是不明白。
    ODBC操纵数据库我以前没有用过,对他的原理了解的不多,还请各位高手帮忙!谢谢!
      

  5.   

    mySet->Open(AFX_DB_USE_DEFAULT_TYPE, "select Top 1 * from mytable", CRecordset::none);
      

  6.   

    to steedhorse(晨星)  在Open()时,就提示“对于造型说明无效的字符串”,怎么办?
      

  7.   

    现在使用了这样一种解决办法:  在Open()之后,先不急于使用AddNew(),而是紧跟着使用  mySet->m_strFilter = "id = -1";  // 该条件什么记录都选不到
      mySet->Requery();  之后再进行AddNew(),Update()其速度就快了。