BOOL CFoxBase::CopyData(_RecordsetPtr &IRecordS, _RecordsetPtr &IRecordD) { _variant_t TempValue; short Item; FieldsPtr IFields; FieldPtr IField; if(IRecordS==NULL || IRecordD==NULL) { ExceptionInfo(_T("Source Recordset or destination Recordset cann't be empty")); return FALSE; } if(IRecordS->adoEOF && IRecordS->BOF) { return TRUE; } if(!IRecordD->adoEOF || !IRecordD->BOF) { try { IRecordD->MoveLast(); } catch(_com_error &e) { ExceptionInfo(e); return FALSE; } } try { IRecordS->MoveFirst(); } catch(_com_error &e) { ExceptionInfo(e); return FALSE; } try { while(!IRecordS->adoEOF) { IRecordS->get_Fields(&IFields); IRecordD->AddNew(); for(Item=0;Item<IFields->GetCount();Item++) { IFields->get_Item(_variant_t(Item),&IField); TempValue=IRecordS->GetCollect(_variant_t(IField->GetName())); IRecordD->PutCollect(_variant_t(IField->GetName()),TempValue); IField.Release(); } IRecordD->Update(); IFields.Release(); IRecordS->MoveNext(); } } catch(_com_error &e) { ExceptionInfo(e); return FALSE; } return TRUE; }
///////////////////////////////////////////////////// // // 在记录集的当前位置插入一条新记录 // // IRecord[in] 记录集智能指针 // // 函数成功返回TRUE,否则返回FALSE // 如果有异常将调用ExceptionInfo函数 // // 函数成功后记录集将指向新插入的空记录 // BOOL CFoxBase::InsertNew(_RecordsetPtr &IRecord,int after) { int pos; CMap<short,short&,_variant_t,_variant_t&> FieldMap; CMap<short,short&,_variant_t,_variant_t&> newFieldMap; //将新增加的记录的值记下来 _variant_t TempValue; short Item; FieldsPtr IFields; FieldPtr IField; int pos1; int nCount; //字段个数. if(IRecord==NULL) { ExceptionInfo(_T("Recordset cann't be empty")); return FALSE; } //如果记录集为空将插入一条新记录 if(IRecord->adoEOF && IRecord->BOF) { try { IRecord->AddNew(); IRecord->Update(); } catch(_com_error &e) { ExceptionInfo(e); return FALSE; } return TRUE; } else if(IRecord->adoEOF) { IRecord->AddNew(); IRecord->Update(); IRecord->MoveLast(); return true; } for(pos=0; !IRecord->adoEOF ;pos++) { try { IRecord->MoveNext(); } catch(_com_error &e) { ExceptionInfo(e); return FALSE; } } // // 查如一条新记录,并将刚开始所指的以后的记录向后移 // try { IRecord->AddNew(); IRecord->Update(); IRecord->MoveLast(); //将新增加的记录的值记下来. IFields = IRecord->GetFields(); nCount = IFields->GetCount(); //字段个数 for (Item = 0; Item < nCount; Item++) { newFieldMap[Item] = IRecord->GetCollect(_variant_t(Item)); } IFields.Release(); // IRecord->MovePrevious(); } catch(_com_error &e) { ExceptionInfo(e); return FALSE; } if(after==1) pos--; //使pos再减一,变成在指针的当前位置上加入一条新记录,insert blank pos1=pos; while(pos>0) { try { for(Item=0;Item<nCount;Item++) { TempValue=IRecord->GetCollect(_variant_t(Item)); FieldMap[Item]=TempValue; } IRecord->MoveNext(); for(Item=0;Item<nCount;Item++) { IRecord->PutCollect(_variant_t(Item),FieldMap[Item]); } IRecord->Update(); IRecord->MovePrevious(); pos--; if(pos>0) IRecord->MovePrevious(); } catch(_com_error &e) { ExceptionInfo(e); return FALSE; } } // 使最开始所指的记录内容为空 if(pos1==0 && after==1) {IRecord->MoveNext();} else { try { TempValue.Clear(); for(Item=0;Item<nCount;Item++) { IRecord->PutCollect(_variant_t(Item),newFieldMap[Item]); } IRecord->Update(); } catch(_com_error &e) { ExceptionInfo(e); return FALSE; } } return TRUE; }