首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-02-19 
求解释....MFC大家看一下,我将文件导入OLB 对象 到底哪错了。。。//说明://theApp.m_pConnection 是全局的 _C

求解释....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);  


SafeArrayAccessData(varBLOB.parray,(void **)pBuf);   


CFile OutFile(L"C://A-复件.TXT",CFile::modeCreate|CFile::modeWrite); 

LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf);
OutFile.Write(buffer,lDataLength);

GlobalUnlock((HGLOBAL)pBuf);
OutFile.Close();

SafeArrayUnaccessData (varBLOB.parray);
}

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

CView::OnRButtonDown(nFlags, point);
}


//这是二进制的信息求解释.MFC大家看一上,小弟我将文件导入OLB 对象 到底哪错了。 buffer 数据库 access
[解决办法]
复制文件A.txt到A复制.txt, 有Windows API可以用, 何必重写? 
CopyFile
CopyFileEx
[解决办法]
我没这么用过,不过跟下代码,第一在写入后,从数据库看看16进制的数据对不对,第二,看读出来的数据对不对,在这两个地方加断点调下先,
引用
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;  
引用
if(varBLOB.vt == (VT_ARRAY 
[解决办法]
 VT_UI1))
        {
            unsigned char *pBuf = NULL;     
            pBuf = (unsigned char*)GlobalAlloc(GMEM_FIXED,lDataLength);  
            SafeArrayAccessData(varBLOB.parray,(void **)pBuf);   

热点排行