合并两个数据库a,b,  从a得item表取出数据,做少量修改,然后插入b得item表,
a得item有200万条数据,b得item有300万条数据,在插入第二条数据时update处报错。代码如下 BOOL CHFLogical::Process_Item(long nStartRecord,long nEndRecord, _RecordsetPtr destrs)
{
          long nMaxItemID=GetTableMaxID("sk_item","id",m_DestGameConn);
CString sqlselect;
sqlselect.Format("select * from sk_item limit %d,%d",nStartRecord,nStartRecord+nEndRecord);
_RecordsetPtr rs;
rs.CreateInstance(__uuidof(Recordset)); _variant_t varval; static long nRecordNum=0; long oldid=0,newid=0,newplayerid=0; long PlayerID=0; long OwnerID=0; long wps1=0,wps2=0,wps3=0,wps4=0; long nTotalCount= GetTableCount("sk_item","id",m_SrcGameConn);
try
{
rs->Open(_bstr_t(sqlselect),m_SrcGameConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); while (!rs->adoEOF) { m_pUI->SetProgressText("sk_item",++nRecordNum,nTotalCount); PlayerID = rs->Fields->GetItem("player_id")->Value; newplayerid = m_MapUserID[PlayerID];
varval = rs->Fields->GetItem("id")->Value;
oldid = (long)varval;
newid = ++nMaxItemID;
//添加新的记录到目标表中
destrs->AddNew();
Sleep(100);
long colcnt = destrs->Fields->Count;
for(long i=0;i<colcnt;i++)
{
destrs->PutCollect(i,rs->Fields->GetItem(i)->Value);
} //设置ID,MasterName
destrs->PutCollect("id",_variant_t(newid)); OwnerID = rs->Fields->GetItem("owner_id")->Value;
if(OwnerID==PlayerID)
destrs->PutCollect("owner_id",_variant_t(newplayerid)); destrs->PutCollect("player_id",_variant_t(newplayerid));
 destrs->Update();
//把新旧id插入到容器中
m_MapItemID[oldid]=newid; //移动到下一条记录
rs->MoveNext();
}
rs->Close();
}
catch (_com_error e) {
AfxMessageBox("Process_Item 出错");
AfxMessageBox(e.Description());
if(rs->GetState()&adStateOpen)
rs->Close();
return FALSE;
}

return true;
}

解决方案 »

  1.   

    报错Incorrect key file for table sk_item.MYI.
      

  2.   

    表引擎是MYISAM的,损坏?
    myisamchk检查一下
    用repair table xxx修复试试
      

  3.   

    修复下该文件.
    myisamchk sk_item.MYI
     
      

  4.   

    这个表开始是好的,由于运行以上操作而导致的损坏,在b数据库的iten表数据少时改程序运行时正确的
      

  5.   

    我只能解释 myisam 表容易损坏;其他的楼下的解释 
      

  6.   

    修改引擎为INNODB,打开事务更新试试
      

  7.   

    程序的错误信息是什么?
    另外你的MYSQL的错误日志中有什么信息?
    一种可能就是你的并发操作过多。
      

  8.   

    错误信息  16:07:00 [ERROR] D:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld: Incorrect key file for table '.\supermandb_d\sk_item.MYI'; try to repair it
      

  9.   

    已经提示,要修复sk_item.MY文件
      

  10.   

    MYSQL错误日志中检查一下,看有些什么信息以供分析毕竟可以导致MYISAM索引文件损坏的原因会有很多。