当前位置: 代码迷 >> C++ >> 求解释.MFC大家看一上,小弟我将文件导入OLB 对象 到底哪错了。
  详细解决方案

求解释.MFC大家看一上,小弟我将文件导入OLB 对象 到底哪错了。

热度:2703   发布时间:2013-02-26 00:00:00.0
求解释....MFC大家看一下,我将文件导入OLB 对象 到底哪错了。。。

//说明:
//  theApp.m_pConnection 是全局的 _ConnectionPtr 对象 已经初始化过
// Access数据库中  有一个表 L,表中有一个字段 A, 其属性为 OLB 对象
//  
//我想单击左键时 将C盘的 A.txt备份到数据库,单击右键时读取文件到 C://A-复件.txt
//可是每次的完成后 我用16进制查看, A-复件.txt的前8个字节总是与 A.txt不一样
//
//*************************************************左键点击导入文件
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
//-------------------------------------------------------------------------
CFile TextFile;  
if(0 == TextFile.Open(L"C://A.Txt",CFile::modeRead))  
return; 

_RecordsetPtr pRecord = NULL;               
_ConnectionPtr pConnection =  theApp.m_pConnection;

unsigned char* pbuf;
long nLength = TextFile.GetLength();  
pbuf = new unsigned char[nLength]; 
//new失败
if(pbuf == NULL)
return;
//读取数据到 pbuf
TextFile.Read(pbuf,nLength);         

unsigned char *pBufEx = NULL;
pBufEx = pbuf;  
//建立一个 SAFFERRAY  
//------------------------------------
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;  
//--------------------------------------
try  
{  
pRecord.CreateInstance(__uuidof(Recordset));  
pRecord->Open("L",pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdUnknown);
//添加记录
pRecord->AddNew();          
pRecord->PutCollect(_variant_t("A"),varBLOB);
pRecord->Update();

pRecord->Close();

catch(_com_error e)
{  
AfxMessageBox(e.Description());
}
//--------------------------------------------------------------------------

CView::OnLButtonDown(nFlags, point);
}
//***************************************************右键点击导出文件
void CTestView::OnRButtonDown(UINT nFlags, CPoint point)
{
//-----------------------------------------------------------------------------------------
_RecordsetPtr pRecord = NULL;
_ConnectionPtr pConnection = theApp.m_pConnection;

VARIANT varBLOB; 
try  
{  
pRecord.CreateInstance(__uuidof(Recordset));  
pRecord->Open("L",pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdUnknown);  
//读出  data    
long lDataLength = pRecord->Fields->GetItem("A")->ActualSize;  
varBLOB = pRecord->GetCollect(_variant_t("A"));

if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
unsigned char *pBuf = NULL;     
pBuf = (unsigned char*)GlobalAlloc(GMEM_FIXED,lDataLength);  
  相关解决方案