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

pdf 保存到数据库再读取解决办法

2012-05-11 
pdf 保存到数据库再读取请问高手,怎样把pdf文件保存到数据库,并读取。还有就是数据库中保存大量的 pdf文件

pdf 保存到数据库再读取
请问高手,怎样把pdf文件保存到数据库,并读取。还有就是数据库中保存大量的 pdf文件会对数据库有影响吗?

[解决办法]
你把pdf当做图片文档之类的读写就可以了
翻翻这里代码很多

另外大量的pdf没尝试过。
不过我想如果你的表简单,每次你仅读取文字描述类的内容,速度不会慢到哪里去的。
等点击或者下载操作发生后,再读入PDF即可。
[解决办法]
建议 PDF 文件本身还是写文件吧, 数据库中保存一个PDF文件路径就行了。 PDF 本身写入数据库的话, 记录少也许无所谓, 记录多了要人命。 而且,要是某个 PDF 20MB ?。。。。那就厉害了
[解决办法]
可以定义BLOB字段来存储PDF文件,但如果数据量很大会影响数据库性能,一般情况下,都是单独存储PDF文件,然后在数据库中存储文件的地址
[解决办法]
用Blob字段存,一般来说数据库的io不如用文件方式的io快,但用数据库存文件更便于管理
BCB实现BLOB字段的读写 


对于SQL中的TEXT、IMAGE、MEMO字段的存取,可以采用下列程序: 
BLOB字段的读取: 
TBlobSTream* TemplateStream; 
char* TempPlatePtr;

TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName 
(\"SearchTem\"),bmReadWrite); 
TemplatePtr= new char[TemplateStream->Size]; 
TemplateStream->Read(TemplatePtr, TemplateStream->Size); 

BLOB字段的写入: 
TBlobSTream* TemplateStream; 
char* TempPlatePtr;

TemplateStream=new TBlobStream((TBlobField*)WebQuery->FieldByName 
(\"SearchTem\"),bmReadWrite); 
TemplatePtr= new char[TemplateStream->Size]; 
TemplateStream->Write(TemplatePtr, TemplateStream->Size); 

________________________________________________________________ 
补充: 
获得字段的大小用函数datalength 

SQL Server端要作一点设置: 
By default, WRITETEXT is a nonlogged operation. This means that
text or image data is not logged when it is written into the database.
To use WRITETEXT in its default, nonlogged state,
//注意!! 
the system administrator must use the sp_dboption system stored
procedure to set select into/bulkcopy,
// 
which allows nonlogged data to be inserted. 

做了试验,直接写SQL语句好象不行. 
____________________________________________________________________ 
一些注意事项和一个例子 
在写入时: 
(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数; 
(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数; 
使得TTable(TQuery)是可写的. 

下面是一个使用TQuery往content表(主键file_id)中插入一条记录的例子, 
script为一个BLOB字段: 
TBlobStream *pScriptStream; 
//插入一条记录 
strSQL1=\"insert into content(file_id,script,key_image) values(\'\"; 
strSQL1=strSQL1+m_szFileID+\"\',null,null)\"; 
dmStoryEditor->qryExec->SQL->Clear(); 
dmStoryEditor->qryExec->SQL->Add(strSQL1); 
dmStoryEditor->qryExec->ExecSQL(); 
dmStoryEditor->qryExec->Close(); 
//整理要写入的Blob数据
LockMemories(NewsScript); 
NewsScript.GetEdition(NewsScript.m_ScriptHead.byteEditionNum); 
NewsScript.m_pScript=(BYTE *)GlobalLock(NewsScript.m_hScript); 
if(NewsScript.m_pScript!=NULL) 

//再将刚插入的记录读出来,使该Query与该条记录关联 
strSQL1=\"select file_id,script from content where file_id=\'\"+ 
m_szFileID+\"\'\"; 
//允许该Query写 
dmStoryEditor->qryExec->RequestLive=true; 
dmStoryEditor->qryExec->SQL->Clear(); 
dmStoryEditor->qryExec->SQL->Add(strSQL1); 
dmStoryEditor->qryExec->Open(); 
dmStoryEditor->qryExec->First(); 


//将该Query置为可写 
dmStoryEditor->qryExec->Edit(); 
pScriptStream=new TBlobStream((TBlobField*)dmStoryEditor-> 
qryExec->FieldByName(\"script\"),bmReadWrite); 
pScriptStream->Write(NewsScript.m_pScript,
 
NewsScript.m_lScriptRealSize); 
dmStoryEditor->qryExec->Post(); 
dmStoryEditor->qryExec->RequestLive=false; 
delete pScriptStream; 

GlobalUnlock(NewsScript.m_hScript); 
UnLockMemories(NewsScript); 

热点排行