说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Access的OLE字段问题,十分头痛,高手指点。代码附后

编辑:说三道四文库 发布时间:2018-06-20 06:05
HTML文档下载 WORD文档下载 PDF文档下载
Access的OLE字段在用VC操作的时候出现奇怪现象,就是某个记录的OLE字段赋值以后,本人给该字段赋给纯文本
CMyApp* pApp = (CMyApp*)AfxGetApp();
pApp->m_pDatabase->BeginTrans();
if(FALSE == DeleteCurrRec())
{
//本人利用先删除后新增的方式来实现OLE字段更新
AfxMessageBox("当前记录无法删除,这将导致更新失败!");
return;
}
m_pContentRecordset->AddNew();
m_pContentRecordset->m_szContent = m_content;
m_pContentRecordset->m_wCode = atol(m_Code.GetBuffer(m_Code.GetLength()));
m_pContentRecordset->m_Resolution.m_dwDataLength = m_strResolution.GetLength();  //OLE字段长度限制
HGLOBAL hGlobal = GlobalAlloc(GPTR,m_strResolution.GetLength());
m_pContentRecordset->m_Resolution.m_hData = GlobalLock(hGlobal);
//下面将纯文本赋给OLE字段
memcpy(m_pContentRecordset->m_Resolution.m_hData,
m_strResolution.GetBuffer(m_strResolution.GetLength()),
m_strResolution.GetLength());
//设置脏标志,便于提交数据
m_pContentRecordset->SetFieldDirty(&m_pContentRecordset->m_Resolution);
m_pContentRecordset->SetFieldNull(&m_pContentRecordset->m_Resolution,FALSE);
m_pContentRecordset->Update();  //更新数据集
pApp->m_pDatabase->CommitTrans();
if(0 == GlobalUnlock(hGlobal))
GlobalFree(hGlobal);
................
问题一:奇怪的问题,赋值没有出现任何问题,按理说严格地执行赋值操作,因为OLE字段赋值时有长度限制,不应该有乱码,而实际取出的值

总是有空字符或乱码,并且TrimRight()都无法去掉,很怪!
问题二:某个记录的OLE字段一旦清空,并提交成功后,第二次便无法打开数据表,总是提示“内存不够”,其实内存很大,本人是用过滤的方

法打开的,代码如下:
CMyApp *pApp = (CMyApp*)AfxGetApp();

m_ContentRecordset = new CContentRecordset(pApp->m_pDatabase);
//设置过滤条件,Code为Content表主键,即是每次只有一条记录被查出来
m_ContentRecordset->m_strFilter.Format("Code=%s",m_Code); 

if(!m_pContentRecordset->Open(CRecordset::dynaset))
{
AfxMessageBox("告内容表打开失败!");
delete m_pContentRecordset;
m_pContentRecordset = NULL;
return FALSE;
}
return TRUE;

高手指教!万分感谢!
m_pContentRecordset->m_Resolution.m_hData = GlobalLock(hGlobal);

GlobalFree(m_pContentRecordset->m_Resolution.m_hData);
m_pContentRecordset->m_Resolution.m_hData=GlobalAlloc(GHND,m_strResolution.GetLength());
LPVOID lpvMem=NULL;
lpvMem= GlobalLock( m_pContentRecordset->m_Resolution.m_hData);

memcpy(lpvMem,
m_strResolution.GetBuffer(m_strResolution.GetLength()),
m_strResolution.GetLength());

...

GlobalUnlock(m_pContentRecordset->m_Resolution.m_hData);
http://www.codeguru.com/mfc_database/MSAccessOLEField.shtml
mark
up
使用ado比较好实现阿,你怎么还用odbc,尤其是存在ole字段时,更应该使用ado阿
问题一:奇怪的问题,赋值没有出现任何问题,按理说严格地执行赋值操作,因为OLE字段赋值时有长度限制,不应该有乱码,而实际取出的值总是有空字符或乱码,并且TrimRight()都无法去掉,很怪!
注意:可能你输入的纯文本超长了,而且你的纯文本是中文字符的,可能系统在截断文本的时候,出现了半个中文的现象,而且那半个中文,正好是不能显示的控制符,当然就成了不能删除的空格了。
总是有空字符或乱码,并且TrimRight()都无法去掉,很怪!
问题二:某个记录的OLE字段一旦清空,并提交成功后,第二次便无法打开数据表,总是提示“内存不够”,其实内存很大,本人是用过滤的方法打开的,
注意:既然你输入的是纯文本,系统在阶段截断文本的时候,是拦腰截断的,并没有在截断的文本尾部添加上\x0的字符串结束符,那么Access在读取mdb文件的时候,不能正确的读取纯文本,当然要出错了。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘