<急求解决>数据曾库的问题!!!

zhusijin 2003-10-20 11:40:32
请教大家关于数据库存取方面的问题,谢谢!!!
   
   数据库使用ACCESS,存取方式为ADO。
   怎样设置数据库中的字段使其能够存取图片,及用C++BUILDER存取字段的方法。
...全文
35 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不懂电脑 2003-10-22
  • 打赏
  • 举报
回复
用一个TDBImage关联到Access的图片字段就可以存取图片了。
netwolver 2003-10-22
  • 打赏
  • 举报
回复
这也是我在CSDN上看到的关于解决数据库的问题,希望有帮助。


表名:mytable
表的字段:
mydate datetime
mytime datetime
mydata image

以下是一个显示二进制的函数:
LPSTR HexToASCii(char* buff, DWORD buffsize)
{
static LPSTR String = NULL;
if(String) { delete String; String = NULL; }

if( (buff==NULL)||(buffsize==0)||(String) ) return 0;

DWORD StrSize = buffsize * 3 + 2;
String = new char[StrSize]; // 申请了内存空间

memset(String,0,StrSize);

BYTE chTmp=NULL;
DWORD chAnd=0x000000F0;
DWORD StrIdx=0, index=0, ii;
for( index; index<buffsize; index++ )
{
for( ii=0; ii<3; ii++,StrIdx++)
{
if(ii==2) String[StrIdx] = ' '; else
{
if(ii) chAnd =0x0000000F; else chAnd = 0x000000F0;
chTmp = char(buff[index]&chAnd); // chAnd = ~chAnd;
if(chTmp>0x0F) chTmp = chTmp >> 4;
if(chTmp<0x0A) chTmp = chTmp + '0'; else chTmp = chTmp + ('A'-10);
String[StrIdx] = chTmp;
}
}//End of for( ii=0; ii<3; ii++,StrIdx++)
}//End of for( index; index<buffsize; index++ )

String[StrIdx] = NULL;
return String;
}

以下是我用来保存二进制数据到数据库的代码:
String sql;
char *p;
TMemoryStream *ms = new(TMemoryStream);
p=new BYTE[257];
ShowMessage(HexToASCii(p,257));
ms->WriteBuffer(p,256);
ShowMessage(IntToStr(ms->Position));
sql="Insert into mytable values(:pdate,:ptime,:pdata)";

Dm->AQ_Cpp->Close();
Dm->AQ_Cpp->SQL->Clear();
Dm->AQ_Cpp->SQL->Text=sql;
Dm->AQ_Cpp->Parameters->ParamByName("pdate")->DataType=ftDate;
Dm->AQ_Cpp->Parameters->ParamByName("pdate")->Value=Date();
Dm->AQ_Cpp->Parameters->ParamByName("ptime")->DataType=ftTime;
Dm->AQ_Cpp->Parameters->ParamByName("ptime")->Value=Time();
Dm->AQ_Cpp->Parameters->ParamByName("pdata")->LoadFromStream(ms,ftBlob);
Dm->AQ_Cpp->ExecSQL();
delete p;
delete ms;

以下是我可以从数据库中读取二进制数据出来的代码:

Dm->AQ_Cpp->Close();
Dm->AQ_Cpp->SQL->Clear();
Dm->AQ_Cpp->SQL->Text="select * from mytable";
Dm->AQ_Cpp->Open();
Dm->AQ_Cpp->Last();
TMemoryStream *ms = new(TMemoryStream);
TBlobField *pbf;
char *p;
p=new BYTE[257];
ms->Clear();
pbf=(TBlobField*)Dm->AQ_Cpp->Fields->FieldByName("mydata");
pbf->SaveToStream(ms);
ms->Position=0;
ms->ReadBuffer(p,256);
ShowMessage(HexToASCii(p,257));
ListBox1->Items->Clear();
for (int i=0;i<256;i++)
{
ListBox1->Items->Add(IntToStr((int)p[i]));
}
delete ms;
delete p;

****************************************
希望以上代码对大家有帮助!
zhusijin 2003-10-21
  • 打赏
  • 举报
回复
请问怎么操作呢?谢谢!!!
pcclever 2003-10-21
  • 打赏
  • 举报
回复
Access的字段可以设置为:OLE 对象 类型

Microsoft Access 表中链接或嵌入的对象(例如 Microsoft Excel 电子表格、Microsoft Word 文档、图形、声音或其他二进制数据)。

最多为 1 G 字节(受可用磁盘空间限制)。
huangjuliang 2003-10-21
  • 打赏
  • 举报
回复
这个不好,
找了一个贴子!

存jpeg到SQL数据库:
if(OpenPictureDialog1->Execute())
{
ADOQuery1->Edit();
TBlobField *Field = (TBlobField*)ADOQuery1->FieldByName("photo");
Field->LoadFromFile(OpenPictureDialog1->FileName);
ADOQuery1->Post();
}

//以下是从数据库读jpeg
#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 >
bool 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 )
else if(Format == ".ICO") PICTURE_MAP__(TIcon)
else if(Format == ".WMF" || Format ==".EMF") PICTURE_MAP__(TMetafile)
else return false ;
}
return true;
}
#undef PICTURE_MAP__(TBit)
//如果要支持GIF,那你要安裝支持GIF的VCL類。



支持多種格式
存入:
if(OpenPictureDialog1->Execute())
{DataSet->Edit();
TBlobField *Field = (TBlobField*)DataSet->FieldByName("photo");
Field->LoadFromFile(OpenPictureDialog1->FileName);
DataSet->FieldByName("photoFormat")->AsString =
ExtractFileExt(OpenPictureDialog1->FileName).UpperCase();
DataSet->Post();
}

nobill 2003-10-20
  • 打赏
  • 举报
回复
你用一个字符字段来存储图片的路径,显示图片时,按路径去查找!

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧