#include "stdafx.h" #include "BrowseForFolder.h" #include "UIIPackageDbOper.h" #include "UIIADORXServer.h" #include "zlib.h" #ifdef _WIN64 #import "msado60_Backcompat_x64.tlb" no_namespace rename("EOF", "EndOfFile") rename("EOS", "EndOfStream") #else #import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile") rename("EOS", "EndOfString") #endif CUIIPackageDbOper::CUIIPackageDbOper() { m_pDbsrv = NULL; } CUIIPackageDbOper::~CUIIPackageDbOper() { } static void DisplayADOException(_com_error &e) { #ifdef _DEBUG _bstr_t bstrSource(e.Source()); _bstr_t bstrDescription(e.Description()); CString sError; sError.Format(_T("Error:\n") _T("\tCode = %08lx\n") _T("\tCode meaning = %s\n") _T("\tSource = %s\n") _T("\tDescription = %s\n"), e.Error(), e.ErrorMessage(), (LPCSTR) bstrSource, (LPCSTR) bstrDescription); AfxMessageBox(sError); //写日志文件 #endif } BOOL CUIIPackageDbOper::PutPackageToDb(CString& sFile,CString& sTableName,CString& sPackageField,CUIIValueTable& table) { if(m_pDbsrv == NULL) return FALSE; _RecordsetPtr pRstPubInfo = NULL; _ConnectionPtr pConnection = NULL; pConnection = m_pDbsrv->GetConnectionPtr(); HRESULT hr= pRstPubInfo.CreateInstance(__uuidof(Recordset)); if(FAILED(hr)) { return FALSE; } pRstPubInfo->CursorType = adOpenKeyset; pRstPubInfo->LockType = adLockOptimistic; hr = pRstPubInfo->Open((LPCTSTR)sTableName,_variant_t((IDispatch*)pConnection,true), adOpenKeyset,adLockOptimistic,adCmdTable); if(FAILED(hr)) { return FALSE; } pRstPubInfo->AddNew(); VARIANT varSrc; BOOL bSuccess = MakeVariantFromFile(varSrc,sFile); if(!bSuccess) { AfxMessageBox(_T("数据打包入库出现错误!")); return FALSE; } sPackageField.TrimRight(_T(']')); sPackageField.TrimLeft(_T('[')); _variant_t varChunk(varSrc); hr = pRstPubInfo->Fields->GetItem((LPCTSTR)sPackageField)->AppendChunk(varChunk); if(FAILED(hr)) { return FALSE; } //Assign the other field record int nSize = table.GetTableLogicSize(); int i = 0; CString sName,sValue,sType; CStringArray arValue; for(i = 0;iFields->GetItem((LPCTSTR)sName); if (pFieldPtr != NULL) { pFieldPtr->PutValue(variant); } } } } //Update the table //执行并返回选择集 try { //执行SQL语句 HRESULT rs = pRstPubInfo->Update(); } catch(_com_error &er) { DisplayADOException(er); pRstPubInfo->Close(); return FALSE; } pRstPubInfo->Close(); return TRUE; } BOOL CUIIPackageDbOper::PutPackageToDb(void* pData,int nSize,CString& sTableName,CString& sPackageField,CUIIValueTable& table) { if(m_pDbsrv == NULL) return FALSE; _RecordsetPtr pRstPubInfo = NULL; _ConnectionPtr pConnection = NULL; pConnection = m_pDbsrv->GetConnectionPtr(); HRESULT hr= pRstPubInfo.CreateInstance(__uuidof(Recordset)); if(FAILED(hr)) { return FALSE; } pRstPubInfo->CursorType = adOpenKeyset; pRstPubInfo->LockType = adLockOptimistic; hr = pRstPubInfo->Open((LPCTSTR)sTableName,_variant_t((IDispatch*)pConnection,true), adOpenKeyset,adLockOptimistic,adCmdTable); if(FAILED(hr)) { return FALSE; } pRstPubInfo->AddNew(); VARIANT varSrc; BOOL bSuccess = MakeVariantFromFile(varSrc,pData,nSize); if(!bSuccess) { AfxMessageBox(_T("数据打包入库出现错误!")); return FALSE; } sPackageField.TrimRight(_T(']')); sPackageField.TrimLeft(_T('[')); _variant_t varChunk(varSrc); hr = pRstPubInfo->Fields->GetItem((LPCTSTR)sPackageField)->AppendChunk(varChunk); if(FAILED(hr)) { return FALSE; } //Assign the other field record int nSize1 = table.GetTableLogicSize(); int i = 0; CString sName,sValue,sType; CStringArray arValue; for(i = 0;iFields->GetItem((LPCTSTR)sName); if (pFieldPtr != NULL) { pFieldPtr->PutValue(variant); } } } } //Update the table //执行并返回选择集 try { //执行SQL语句 HRESULT rs = pRstPubInfo->Update(); } catch(_com_error &er) { DisplayADOException(er); pRstPubInfo->Close(); return FALSE; } pRstPubInfo->Close(); return TRUE; } BOOL CUIIPackageDbOper::UpdatePackage(CString& sUpdateResetSQL,CString& sPackageField,CString& sFile) { if(m_pDbsrv == NULL) return FALSE; CFileException eFile; CFile fileSave; if (!fileSave.Open(sFile,CFile::modeReadWrite|CFile::shareDenyWrite|CFile::shareDenyRead|CFile::typeBinary,&eFile) ) { return FALSE; } _variant_t varChunk; long nLength = (int)fileSave.GetLength(); BYTE* pbuf; pbuf = new BYTE[nLength]; if(pbuf == NULL) return FALSE; fileSave.Read(pbuf,nLength); fileSave.Close(); BYTE *pBufEx; pBufEx = pbuf; SAFEARRAY* psa; SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0; rgsabound[0].cElements = nLength; psa = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < nLength;i++) { SafeArrayPutElement(psa,&i, pBufEx++); } VARIANT varBLOB; varBLOB.vt = VT_ARRAY | VT_UI1; varBLOB.parray = psa; _ConnectionPtr pConnection = NULL; pConnection = m_pDbsrv->GetConnectionPtr(); _CommandPtr pCom; HRESULT hr= pCom.CreateInstance(__uuidof(Command)); if (FAILED(hr)) { return FALSE; } pCom->ActiveConnection = pConnection; pCom->CommandText = _bstr_t(sUpdateResetSQL); pCom->CommandType = adCmdText; pCom->Parameters->Append(pCom->CreateParameter(_T("@Param"),adVarBinary, adParamInput, -1, varBLOB)); try { //执行SQL语句 pCom->Execute(NULL,NULL,adCmdText); } catch(_com_error &er) { DisplayADOException(er); return FALSE; } return TRUE; } BOOL CUIIPackageDbOper::UpdatePackage(CString& sSQL,CString& sPackageField,void* pData,int nSize) { if(m_pDbsrv == NULL) return FALSE; _variant_t varChunk; long nLength = nSize; BYTE* pbuf = (BYTE*)pData; BYTE *pBufEx; pBufEx = pbuf; SAFEARRAY* psa; SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0; rgsabound[0].cElements = nLength; psa = SafeArrayCreate(VT_UI1, 1, rgsabound); for (long i = 0; i < nLength;i++) { SafeArrayPutElement(psa,&i, pBufEx++); } VARIANT varBLOB; varBLOB.vt = VT_ARRAY | VT_UI1; varBLOB.parray = psa; _ConnectionPtr pConnection = NULL; pConnection = m_pDbsrv->GetConnectionPtr(); _CommandPtr pCom; HRESULT hr= pCom.CreateInstance(__uuidof(Command)); if (FAILED(hr)) { return FALSE; } pCom->ActiveConnection = pConnection; pCom->CommandText = _bstr_t(sSQL); pCom->CommandType = adCmdText; pCom->Parameters->Append(pCom->CreateParameter(_T("@Param"),adVarBinary, adParamInput, -1, varBLOB)); try { //执行SQL语句 pCom->Execute(NULL,NULL,adCmdText); } catch(_com_error &er) { DisplayADOException(er); return FALSE; } return TRUE; } BOOL CUIIPackageDbOper::OutPackageToFile(CString& sFile,CString& sSQL,CString& sPackageField,BOOL bExport) { CString sPath; BOOL bSuccess = FALSE; if(bExport) { int nIndex = sFile.ReverseFind(_T('\\')); if (nIndex == -1) { HWND hWnd = ::AfxGetMainWnd()->m_hWnd; bSuccess = CBrowseForFolder::BrowseForFolder(hWnd,sPath,_T("请选择放置文件路径,然后确定."),0); if(!bSuccess) { return FALSE; } sPath += _T("\\"); } else { sPath = sFile.Mid(0,nIndex + 1); sFile = sFile.Mid(nIndex + 1); } } else { TCHAR szTempfile1[MAX_PATH]; GetTempPath(_MAX_PATH,szTempfile1); sPath = szTempfile1; } sPath += sFile; sFile = sPath; if(m_pDbsrv == NULL) return NULL; _ConnectionPtr pConnection = NULL; pConnection = m_pDbsrv->GetConnectionPtr(); _RecordsetPtr pRec = pConnection->Execute((LPCTSTR)sSQL, NULL, adCmdText); if(pRec == NULL || pRec->EndOfFile == -1) { return NULL; } long lChunkSize = 0; _variant_t varChunk; lChunkSize = (long)pRec->Fields->Item[(LPCTSTR)sPackageField]->ActualSize; if(lChunkSize <= 0) return NULL; varChunk = pRec->Fields->Item[(LPCTSTR)sPackageField]->GetChunk(lChunkSize); bSuccess = MakeFileFromVariant(sPath,varChunk,lChunkSize); // return bSuccess; } BOOL CUIIPackageDbOper::MakeFileFromVariant(CString& sFile,VARIANT& vtArray,long lDataSize) { char* pBuffer = NULL; COleSafeArray safeArray; safeArray.Attach(vtArray); safeArray.AccessData((void**)&pBuffer); BOOL bRes = FALSE; int l_file_size = lDataSize; uLongf udestLen = l_file_size; byte* pDest = (byte*)pBuffer; #ifdef ZIP_DATA byte* pOff = (byte*)pBuffer; pOff += ( lDataSize - sizeof(long) ); l_file_size = *((long*)pOff); //解压缩 pDest = new byte[l_file_size + 512];//放大512 udestLen = l_file_size + 512; if ( Z_OK == uncompress(pDest,&udestLen,(byte*)pBuffer,lDataSize - sizeof(long) ) ) { CFile file; if(file.Open(sFile,CFile::modeCreate | CFile::modeWrite)) { int nRepeat = udestLen / 4096; int i = 0; char* pBufferT = (char*)pDest; for(i = 0;i 0) { file.Write(pBufferT,nRemnant); } file.Close(); bRes = TRUE; } delete [] pDest; } #else CFile file; if(file.Open(sFile,CFile::modeCreate | CFile::modeWrite)) { int nRepeat = udestLen / 4096; int i = 0; char* pBufferT = (char*)pDest; for(i = 0;i 0) { file.Write(pBufferT,nRemnant); } file.Close(); bRes = TRUE; } #endif safeArray.UnaccessData(); safeArray.Detach(); return bRes; } BOOL CUIIPackageDbOper::GetConvertValue(_variant_t & variant,CString& sValue,CString& sType) { if( sType == _T("varchar") || sType == _T("text")) { variant = (LPCTSTR)sValue; } else if(sType == _T("int")) { variant = _ttoi(sValue); } else if(sType == _T("float")) { variant = _tstof(sValue); } else if(sType == _T("datetime")) { variant = (LPCTSTR)sValue; } else { return FALSE; } return TRUE; } BOOL CUIIPackageDbOper::MakeVariantFromFile(VARIANT& vtArray,CString& sFile) { CFileFind fileFind; BOOL bFind = fileFind.FindFile(sFile); if(bFind) { CFile file; file.Open(sFile,CFile::modeRead); DWORD nLength = (DWORD)file.GetLength(); //限制附件 double dSizeK = (nLength*1.0) / 20000000.0;//20M if(dSizeK - 1.0 > 0.001) { AfxMessageBox(_T("选择的附件文件过大!建议压缩后再作附件!")); file.Close(); return FALSE; } COleSafeArray safeArray; safeArray.CreateOneDim(VT_UI1,nLength,NULL); CWaitCursor wait; DWORD dwRead = 0; BYTE buffer[4096]; long nIndex[1]; nIndex[0] = 0; do { dwRead = file.Read(buffer,4096); if(dwRead > 0) { for(DWORD i = 0;i < dwRead;i++) { safeArray.PutElement(nIndex,&buffer[i]); nIndex[0] += 1; } } } while (dwRead > 0); file.Close(); vtArray = safeArray.Detach(); } return TRUE; } BOOL CUIIPackageDbOper::MakeVariantFromFile(VARIANT& vtArray,void* pData,int nSize) { COleSafeArray safeArray; safeArray.CreateOneDim(VT_UI1,nSize,NULL); CWaitCursor wait; BYTE* pBuffer = (BYTE*)pData; long nIndex[1]; nIndex[0] = 0; for(int i = 0;i < nSize;i++) { safeArray.PutElement(nIndex,&pBuffer[i]); nIndex[0] += 1; } vtArray = safeArray.Detach(); return TRUE; }