void CBllHelp::QueryByCondit(_RecordsetPtr pRecordSet,vector<string> &vecField, vector<string> &vecRecordSet, long &lFieldCounts) { //判断存在记录 if(pRecordSet == NULL) return ; if (!vecRecordSet.empty()) { vecRecordSet.clear(); } if (!vecField.empty()) { vecField.clear(); } try { //字段个数 lFieldCounts = pRecordSet->GetFields()->GetCount(); adoDataTypeEnum enumDataType; _bstr_t str; //字段名称、类型、大小 for(long i = 0; i<lFieldCounts; i++) { str= pRecordSet->GetFields()->GetItem(i)->GetName(); vecField.push_back((LPSTR)str); enumDataType = pRecordSet->GetFields()->GetItem(i)->GetType(); str = GetDataTypeString(enumDataType); vecField.push_back((LPSTR)str); str = pRecordSet->GetFields()->GetItem(i)->GetDefinedSize(); vecField.push_back((LPSTR)str); } pRecordSet->MoveFirst(); long lCounts = 0; _variant_t var; //获取记录 while(!pRecordSet->adoEOF) { for(long j=0; j<lFieldCounts; j++) { var=pRecordSet->GetCollect(j); str=(_bstr_t)(var.vt==1?"":var); vecRecordSet.push_back((LPSTR)str); } pRecordSet->MoveNext(); lCounts++; } } catch(_com_error e) { //AfxMessageBox("记录为空"); } }
//存Buffer bool CRsDupRgn::SaveBufferField(CBaseDBEntity *pGoods, const char* szFiledName, _RecordsetPtr &rs) { if(pGoods == NULL) return false; if(szFiledName == NULL) return false; VARIANT varBLOB; SAFEARRAY* psa; CEntityProperty* ep = pGoods->GetDataEntityManager().GetEntityProperty(string(szFiledName)); if(NULL == ep) return false; BYTE* buffer = NULL; long dataSize = ep->GetBufSize(0); if(dataSize) { buffer = new BYTE[dataSize]; ep->GetBufAttr(0, (void*)buffer, dataSize); long lSize=(long)dataSize; SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound=0; rgsabound[0].cElements=lSize; psa=SafeArrayCreate(VT_UI1,1,rgsabound); for(long i=0;i<lSize;i++) { SafeArrayPutElement(psa,&i,&buffer[i]); } varBLOB.vt=VT_ARRAY|VT_UI1; varBLOB.parray=psa; try { rs->GetFields()->GetItem(szFiledName)->AppendChunk(varBLOB); } catch(_com_error e) { PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN, STR_DBS_DUPRGN_SAVERGNOBJFAIL), e); SAFE_DELETE_ARRAY(buffer); return false; } SafeArrayDestroy(psa); } SAFE_DELETE_ARRAY(buffer); return true; }
//读Buffer bool CRsDupRgn::LoadBufferField(CBaseDBEntity *pGoods, const char* szFiledName, _RecordsetPtr &rs) { if(pGoods == NULL) return false; try { if(rs->GetadoEOF()) { ReleaseRs(rs); return false; } long lSize=0; FieldsPtr fldPtr = rs->GetFields(); FieldPtr itemPtr = fldPtr->GetItem(szFiledName); lSize = itemPtr->ActualSize; if(lSize > 0) { _variant_t varBLOB; varBLOB = itemPtr->GetChunk(lSize); BYTE *pBuf=NULL; SafeArrayAccessData(varBLOB.parray,(void**)&pBuf); SafeArrayUnaccessData(varBLOB.parray); // 清空SKILL CEntityProperty* ep = pGoods->GetDataEntityManager().GetEntityProperty(string(szFiledName)); if(ep) ep->SetBufAttr(0, pBuf, lSize); } } catch(_com_error e) { PrintErr(CStringReading::LoadString(IDS_DBS_RSDUPRGN,STR_DBS_DUPRGN_LOADRGNOBJERR), e); return false; } return true; }
///////////////////////////////////////////////////////////////////////////////////////// // // 在记录集中当前游标位置设置指定的字段的值 // // IRecordset[in] 记录集智能指针 // FieldsName[in] 字段名 // Value[in] 新的值 // // 如果有异常将调用ExceptionInfo函数 // // 如果Value为空或全为空格字符,当指定的字段的类型为字符串型时,字段的值为空 // 如果字段的类型为数字型,字段的值为0 // void CFoxBase::PutTbValue(_RecordsetPtr IRecordset, _variant_t FieldsName, CString Value) { adoDataTypeEnum DataType; if(IRecordset==NULL) return; Value.TrimLeft(); Value.TrimRight(); try { if(Value.IsEmpty()) { IRecordset->GetFields()->GetItem(FieldsName)->get_Type(&DataType); if(DataType==adBSTR || DataType==adChar || DataType==adVarChar || DataType==adVarWChar ||DataType==adWChar) { Value=_T(""); } else { Value=_T("0"); } } IRecordset->PutCollect(FieldsName,_variant_t(Value)); IRecordset->Update(); } catch(_com_error /*&e*/) { // ExceptionInfo(e); throw; } }
///////////////////////////////////////////////////// // // 在记录集的当前位置插入一条新记录 // // 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; }