BCB存取图片等信息!

2008-04-10 02:57:20来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


如何存储图片信息到数据库中呢!
太多的时候我们要保存图片,电影,MP3,究竟该怎么处理这些信息呢呢!太多的情况下,我们认为应该存储图片保存的路径信息,但是我们考虑数据库要备份的问题的时候,以及数据库要实现转移的时候,可能给我们造成诸多不便!我觉得在某些情况下应该存储图片信息也许是个好主意;就象我们在设计数据库的时候,如果数据量很小的情况下,可以考虑用数据冗余的方法来减少视图的数量;设计数据库是个很灵活的过程,不是说那本书就可以完成任务的,要考虑到程序员和用户的使用方便取一个折中。
经常在CSDN上游逛,经常会遇到太多的相同的问题出现,我觉得应该总结一下,对后来者也有一点点帮助,以谢CSDN前辈们对我的帮助;这里讨论的是如何在BCB中存取图片信息。
第一个是用TADOQuery实现的,就是用SQL语句加上参数实现的。
参考http://expert.csdn.net/Expert/topic/1805/1805073.xml?temp=.556637这个写的,如果你不愿意找的话,原码如下:
if(OpenPictureDialog1->Execute())
{
String strSql = "INSERT INTO table1 (content)";
strSql = strSql " VALUES(:picture)";
try{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(strSql);
ADOQuery1->Parameters->ParamByName("picture")->LoadFromFile(OpenPictureDialog1->FileName, ftBlob);
ADOQuery1->ExecSQL();
} catch(...) { return; }
}
还有一个是用Delphi写的,原码如下(没有调试):
//(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数;
//(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数;
var
ms : TADOBlobStream;
begin
query1.Edit;//只能是Edit;不能是Append 和 Insert;
ms := TADOBlobStream.Create(TBlobField(query1.FieldByName(''''BMP'''')), bmRead);
ms.Seek(0, soFromBeginning);
ms.SaveToFile(''''d:\l.bmp'''');
query1.Post;
ms.Free;
end;
同样那位大哥的BCB代码如下:
//(1)如果使用的是TTable,则要将其ReadOnly属性先置为false,然后调用Edit函数;
//(2)如果使用的是TQuery,则要将其RequestLive属性先置为true,然后调用Edit函数;
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
Table1->Edit();;//只能是Edit();不能是Append() 和 Insert();
TBlobField * pField=(TBlobField *)Table1->FieldByName("图字段名");
TBlobStream * pmem=new TBlobStream(pField,bmWrite);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromFile("d:\\image\\a.bmp");
pBitmap->SaveToStream(pmem);
Table1->Post();
delete pBitmap;
delete pmem;
}
同样类似的BCB代码如下(上边的虽然没有调试,但和我写的道理还是一样的,就是用数据库中的一个字段和一个流对象,然后对流进行操作而已):
TMemoryStream *stream = new TMemoryStream();
Image1->Picture->Bitmap->SaveToStream(stream);
ADOTable1->Insert();
ADOTable1->FieldByName("title")->AsString=Edit1->Text;
((TGraphicField *)(ADOTable1->FieldByName("content")))->LoadFromStream(stream);
ADOTable1->Post();
delete stream;
读取的方法类似,当为了方便大家,还是写出来,如下:
include <clipbrd.hpp>
TStream *Stream1;
TJPEGImage *Pjp;
Pjp=new TJPEGImage();
ADOQuery1->Open();
try
{
Stream1=ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("treenodes"), bmRead);//treenodes是存放jpeg内容的字段,它的类型一定要用image
Pjp->LoadFromStream(Stream1);//Image2是TDBImage组件,它的DateSource,和FieldName属性要空着
Image2->Picture->Bitmap->Assign(Pjp);
delete Stream1;
}
__finally
{
ADOQuery1->Close();
delete Pjp;
}
还有更绝的,用个宏,如下:
以下是讀出各種類型的圖片的程序,支持ADO,BDE或TClientDataSet
#define PICTURE_MAP__(TBit) {TBit *PG = new TBit(); \
try {PG->LoadFromStream(TmpStream);\
Pic->Assign(PG); \
}\
catch(...)\
{delete PG ;\
return false;\
}\
delete PG;\
}
//----------------------------------------------------------------
//該模板將二進制字段中的圖像(GIF或JPG等等)使用Assign方法轉為TPicture,TBitmap等等。
template <class T >
ool LoadPhotoFromField(TField *F_Photo,const AnsiString Format,T *Pic)
if(!F_Photo->DataSet->Active) return false ;
if(F_Photo->IsNull) return false ;
else
{TStream *TmpStream = F_Photo->DataSet->CreateBlobStream(F_Photo,bmRead);
if(Format == ".JPG" || Format == ".JPEG")PICTURE_MAP__(TJPEGImage )
else if(Format == ".BMP") PICTURE_MAP__(Graphics::TBitmap)
// else if(Format == ".GIF") PICTURE_MAP__(TGIFImage )

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Delphi编码规范

下一篇:NeHe的opengl教程delphi版(7)----滤波