社区
数据库
帖子详情
VC6下如何向Oracle中添加和读取BLOB型的数据?
kulukyo
2003-09-14 07:55:54
把大量较大的二进制数据(比如图像)存储在数据库中,怎么做比较合适?
1.存储在Blob中(会不会对数据库的效率影响很大?)
2.图像存储在文件中,在数据库中存储文件名(这样就失去了数据库的安全性的优势!)
对这个问题一直没有搞清楚,希望各位高手给点建议!!!!!!!
bow.....
...全文
185
4
打赏
收藏
VC6下如何向Oracle中添加和读取BLOB型的数据?
把大量较大的二进制数据(比如图像)存储在数据库中,怎么做比较合适? 1.存储在Blob中(会不会对数据库的效率影响很大?) 2.图像存储在文件中,在数据库中存储文件名(这样就失去了数据库的安全性的优势!) 对这个问题一直没有搞清楚,希望各位高手给点建议!!!!!!! bow.....
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
kulukyo
2003-09-15
打赏
举报
回复
Oralce中我用表向导创建一个表,含有BLOB字段,可是无法指定大小!
还有,我的文件大小是不固定的,为BlOB指定大小后,可以插入不同长度的数据吗?
Ryan1005
2003-09-15
打赏
举报
回复
关注中,我是做图象数据库的,因此也十分关注这个问题。
kulukyo
2003-09-15
打赏
举报
回复
多谢1楼的lwugui(笑熬浆糊) ,问题已经解决!
还有一个问题,把大数据存储在Oracle中与存储在文件中相比,存储或者读取时哪个速度更快些?
如果我存储了大批的数据到Oracle中,会不会造成数据库文件过大而影响速度和性能?是不是Oracle中的分区存储和表空间就是针对这种情况而产生的解决方案??
不吝赐教。
lwugui
2003-09-14
打赏
举报
回复
VC存取数据库中的大对象
在用Visual C++编写应用程序时,常会遇到如何存取数据库中大对象的问题。大对象文档以二进制数据形式保存在BLOB类型的字段中,这些大对象可能是Word、Execl或图片文件等,目前多数数据库都支持BLOB类型的字段。
VC存取这些大对象数据有众多方法,如OLE、ActiveX等,事实上VC的MFC提供了一个很方便的实现方法,即利用MFC提供的CLongBinary类可以方便地实现存取BLOB字段。下面笔者将举例说明。
首先用以下SQL语句建一个含BLOB字段的数据表:
CREATE TABLE REPORTTABLE(REGISTERNUM CHAR(12) NOT NULL,REPORT BLOB(5M),PRIMARY KEY(REGISTERNUM));
建完该表后,配置好ODBC数据源,设定数据源名为ABCDB。
我们用VC的MFC AppWizard建一个新的Project,设定项目名为ABC,下一步选Single Document,在提示你想包含什么样的数据库支持时,选Header files only,然后完成建立。
接着在Resources的Dailog资源中新建一个FormView,打开该FormView,启用ClassWizard,建立一个新类,设定类名叫CReportRecordSet,Base Class选CRecordSet,然后选ABCDB为数据源,再选择表REPORTTABLE,启动ClassWizrd,并建立新类CReportFormView,Base Class为CRecordView,选Recordset时,选CReportRecordSet。
打开ReportRecordSet.h,找到该行:CString m_REPORT; 改为CLongBinary m_REPORT;这样程序就知道m_REPORT是和BLOB字段交换数据。同样,我们还需要修改另外几处,打开ReportRecordSet.cpp后,删除m_REPORT = _T("");一句。再找到RFX_Text(pFX, _T("[REPORT]"), m_REPORT);一句,将其改为RFX_LongBinary(pFX, _T("[REPORT]"), m_REPORT); ODBC方法存取数据库时使用RFX_LongBinary;DAO方法则用DFX_LongBinary。
再次打开FormView,添加一个Edit控件,并用ClassWizard将它和member variable m_pSet-〉m_ REGISTERNUM关联,然后在FormView上增加三个按键,Caption名分别叫“取得Word文档”、“更新word文档”、“新增word文档”。并分别为这三个按键建立各自的Function,然后我们为这三个按键增加相应的代码。在按键“取得Word文档”的Function中加入如下代码:
try //该程序的所在当前目录是e:\qc\abc\
{ if (m_pSet-〉IsEOF())
AfxMessageBox("没有该小组的成果报告");
else {//下面检测临时文件tyj.doc是否存在
HANDLE hFind;
WIN32_FIND_DATA findData = {0};
hFind=FindFirstFile("e:\\qc\\abc\\tyj.doc",&&findData);
// FindFirstFile是Windows API 函数
if(hFind = = INVALID_HANDLE_VALUE)
AfxMessageBox("不存在临时文件");
else
{AfxMessageBox("有临时文件");
DeleteFile("e:\\qc\\abc\\tyj.doc");
//利用API函数删除该临时文件
}
CString strFileName="e:\\qc\\abc\\tyj.doc";
CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);
//modeCreate指示构造函数创建一个新文件
//下面这段把已经在内存中的BLOB字段数据内容写到临时生成的文件tyj.doc中
LPSTR buffer = (LPSTR)GlobalLock(m_pSet-〉m_REPORT.m_hData);
outFile.WriteHuge(buffer,m_pSet-〉m_REPORT.m_dwDataLength);
GlobalUnlock(m_pSet-〉m_REPORT.m_hData);
outFile.Close();
ShellExecute(NULL,NULL,_T("tyj.doc"),NULL,_T("e:\\qc\\abc\\"),NULL);
//下面执行外部程序,Word会自动启动并打开tyj.doc} }
catch(CExceptionpE)
{ pE-〉ReportError();
pE-〉Delete();
return; }
在按键“更新word文档”的Function中加入以下程序代码:
m_pSet-〉Edit(); // 声明编辑当前记录
UpdateData(TRUE);
CFile fileword;
CFileStatus fileStatus;
CString fileLocate;
static char BASED_CODE szFilter[] = "WORD Files (.doc)|.doc||";
// 下面将弹出典型的打开文件对话框,您可以选择任何目录下的.doc文件
CFileDialog dlg(TRUE,NULL,NULL,0,szFilter,this);
if(dlg.DoModal()= =IDOK)
fileLocate=dlg.GetPathName();
else
fileLocate="";
if(fileLocate= ="")
AfxMessageBox("您没选文件");
else{
fileword.Open(fileLocate,CFile::modeRead);
fileword.GetStatus(fileStatus);
m_pSet-}m_REPORT.m_dwDataLength=fileStatus.m_size;
HGLOBAL hGlobal = GlobalAlloc(GPTR,fileStatus.m_size);
m_pSet-}m_REPORT.m_hData = GlobalLock(hGlobal);
fileword.ReadHuge(m_pSet-)m_REPORT.m_hData,fileStatus.m_size);
//把您选择的文件的数据写入m_pSet-}m_REPORT
m_pSet-}SetFieldDirty(&&m_pSet-)m_REPORT);
m_pSet-}SetFieldNull(&&m_pSet-)m_REPORT,FALSE);
m_pSet-}Update(); // 更新记录
GlobalUnlock(hGlobal); }
上述代码只要稍做修改,即可把Execl等各类文件存入数据库中。对应按键“新增word文档”只需要复制“更新Word文档”中的代码,并把m_pSet-〉Edit();换成m_pSet-〉AddNew();即可。完成上述步骤后,打开abc.cpp,把RUNTIME_CLASS(CAbcView));这句换成RUNTIME_CLASS(CReportFormView)); 这样程序启动时就显示了该FormView。
以上所有代码均在IBM UDB6、Visual C++ 6.0、Windows 98环境下
在
VC6
中
使用ADO
读取
Oracle
中
的
BLOB
字段
在
VC6
中
使用ADO
读取
Oracle
中
的
BLOB
字段
oracle
8i用ado
读取
blob
,vc+ado存取
oracle
blob
字段出现有关问题
VC/MFC»vc+ado存取
oracle
blob
字段出现有关问题vc+ado存取
oracle
blob
字段出现有关问题www.myexceptions.net网友分享于:2013-01-14浏览:116次vc+ado存取
oracle
blob
字段出现问题我有一块WORD
型
的
数据
,有128*128个...
VC ADO
Oracle
读写
BLOB
1、向
数据
库
中
插入一条带有
BLOB
字段的记录 以下为手动敲入 由于环境问题不能copy 代码 如有笔误或者错误请见谅_Connection m_pConnection;//假设已得到CFile m_file;CFileException e;_RecordsetPtr m_pRecordset;...
excel
读取
oracle
,
Oracle
读取
excel
数据
包体: create or replace package body xyg_pub_data_upload_pkg as function convert_file_
blob
(p_filedir in varchar2 ---文件路径 /usr/usr/glmr/customer , p_filename in varchar2 ---文件名称 DHS.csv , p_...
关于
oracle
中
blob
字段的录入问题
在
oracle
中
,有4个大对象(lobs)类
型
可用,分别是
blob
,clob,bfile,nclob。 下面是对lob
数据
类
型
的简单介绍。
blob
:二进制lob,为二进制
数据
,最长可达4GB,存贮在
数据
库
中
。 c...
数据库
4,011
社区成员
39,820
社区内容
发帖
与我相关
我的任务
数据库
VC/MFC 数据库
复制链接
扫一扫
分享
社区描述
VC/MFC 数据库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章