使用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(); // 就是在这一步,耗用的时间特别长
mySet->m_id = "12342134";
mySet->Update(); // 就是在这一步,耗用的时间特别长
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;
由于这是别人的程序,如果要改成这样,那改动的地方太多了,有没有别的办法?
我一直在想,是不是Open()将所有数据记录都返回来,由于ODBC做了优化,因此在Open()是没有表现出慢,而是在数据集改变时,即AddNew或是Update时才表示出来。能不能在Open时使用SQL条件将该表数据少选一点,或是根本不选。这个程序不需要查询数据,只需要添加。
mySet->m_strFilter = "id = -1";
或是
mySet->Open(AFX_DB_USE_DEFAULT_TYPE, "select * from mytable where id = -1", CRecordset::none);在进行Update()时,总是提示错误,有“字符串是右截位...”,“日期出错”等,但没有不加这些,则一切正常。
ODBC操纵数据库我以前没有用过,对他的原理了解的不多,还请各位高手帮忙!谢谢!
mySet->Requery(); 之后再进行AddNew(),Update()其速度就快了。