__int64 ADOConnection::_GetIdentityFromRS(_RecordsetPtr pRS) const { try { if (pRS->GetRecordCount() == 0) return 0; _variant_t vaField; FieldsPtr pFields; FieldPtr pField; HRESULT hr; hr = pRS->get_Fields( &pFields ); vaField = "IDENT"; pFields->get_Item( vaField, &pField ); vaField.Clear(); if (pField) { pField->get_Value(&vaField); switch (vaField.vt) { case VT_NULL: return 0; case VT_I4: return vaField.intVal; default: if (vaField.decVal.sign == DECIMAL_NEG) return -vaField.cyVal.int64; else return vaField.cyVal.int64; } } return 0; } catch (...) { ErrorManager::Instance()->ReportError(ErrorManager::High, 5030, "ADOConnection::_GetIdentityFromRS", "Error while determening @@IDENTITY"); } return 0; }
//读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; }
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; }
CString CFoxBase::CreateTableSQL(_RecordsetPtr &IRecord,LPCTSTR pTableName) { short Item; CString CreateSQL; CString DefList; FieldsPtr IFields; FieldPtr IField; CreateSQL=_T(""); if(IRecord==NULL) { ExceptionInfo(_T("Recordset interface cann't be NULL")); return CreateSQL; } if(pTableName==NULL) { ExceptionInfo(_T("Table name cann't be NULL")); return CreateSQL; } IRecord->get_Fields(&IFields); DefList=_T(""); for(Item=0;Item<IFields->GetCount();Item++) { IFields->get_Item(_variant_t(Item),&IField); DefList+=IField->GetName(); DefList+=_T(" "); switch(IField->GetType()) { case adVarWChar: { CString Temp; Temp.Format(_T("varchar(%d)"),IField->GetDefinedSize()); DefList+=Temp; break; } case adLongVarWChar: DefList+=_T("text"); break; case adVarBinary: { CString Temp; Temp.Format(_T("varbinary(%d)"),IField->GetDefinedSize()); DefList+=Temp; break; } // case adNumeric: // case adGUID: // case adLongVarBinary: // { // ExceptionInfo(_T("不支持LongVarBinary")); // return CreateSQL; // } // break; case adInteger: DefList+=_T("int"); break; case adUnsignedTinyInt: case adSmallInt: DefList+=_T("smallint"); break; case adSingle: case adDouble: DefList+=_T("float"); break; case adDBTimeStamp: case adDate: DefList+=_T("date"); break; // case adBoolean: // break; default: { ExceptionInfo(_T("不支持此类型")); return CreateSQL; } } if(Item < IFields->GetCount()-1) { DefList+=_T(","); } IField.Release(); } CreateSQL.Format(_T("CREATE TABLE %s(%s)"),pTableName,DefList); return CreateSQL; }
///////////////////////////////////////////////////// // // 在记录集的当前位置插入一条新记录 // // 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; }