读书人

求解释.MFC大家看一上小弟我将文件导

发布时间: 2013-02-19 11:11:40 作者: rapoo

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

读书人网 >C++

热点推荐