用TQuery控件从数据库返回的图片无法正常显示??!!高手赐教
我开始是用DBImage指向Table控件,来将图片提交到后端SQL Server, 但用TQuery将图片从数据库返(select Stylepic from Orders)时,DBImage(已指向TQuery)里的图片却无法正常显示(显示黑色),在数据库的为jpg文件,我已经定义 <jpeg.hpp> 不知问题出在哪里,请各位赐教 问题点数:100、回复次数:4Top
1 楼winkiky(生命不息战斗不止)回复于 2002-10-20 16:00:34 得分 20
TMemoryStream *tmpStream = new TMemoryStream();
TStream *Stream;
Graphics::TBitmap *bitmap = new Graphics::TBitmap();
ADOQuery1->Close();
ADOQuery1->SQL->Clear ();
ADOQuery1->SQL->Add("select * from test where id='test2'");
ADOQuery1->Open(); //返回插入的行数
Stream=ADOQuery1->CreateBlobStream(ADOQuery1->FieldByName("pic"),bmRead);
tmpStream->CopyFrom(Stream,Stream->Size);
tmpStream->SaveToFile("F:\\test.bmp");
bitmap->LoadFromFile("F:\\test.bmp");
Image1->Picture->Bitmap=bitmap;
你试试这个,原理和步骤基本是这样的!Top
2 楼oyxiaoyu0(小雨仔)回复于 2002-10-20 16:57:09 得分 10
最好存储成BLOB的形式的,这样你的图片是什么格式的都无所谓了Top
3 楼tony808(文君)回复于 2002-10-21 14:41:34 得分 20
try
{
AdoQ->Edit();
TBlobField * pField=(TBlobField *)AdoQ->FieldByName("UserPhoto");
TADOBlobStream * pmem=new TADOBlobStream (pField,bmWrite);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->Assign(Image1->Picture->Graphic);
pBitmap->SaveToStream(pmem);
delete pBitmap;
delete pmem;
AdoQ->Post();
}
catch(...)
{
frmMain->Timer1->Enabled = true;
Application->MessageBox("用户的照片存贮不正确,请你检查...!","提示",MB_OK);
}
try
{
TBlobField * pField=(TBlobField *)AdoQ->FieldByName("UserPhoto");
TADOBlobStream* pmem=new TADOBlobStream (pField,bmRead);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromStream(pmem);
Image1->Picture->Assign(pBitmap);
delete pBitmap;
delete pmem;
}
catch(...)
{
;
}
jpg的要改,bmp的可以直接用的
你去试试吧
Top
4 楼bigwhiteshark(变性鲨鱼)回复于 2002-10-21 15:12:27 得分 50
BCB+MS,SQL如何將jpg文件存入SQL表中?
用TBlobStream类
具体的用法查F1
//save jpg to database
if(OpenDialog1->Execute())
{
//TMemoryStream *stream=new TMemoryStream();
//stream->LoadFromFile(OpenDialog1->FileName);
//stream->Position=0;
if(!ADOTable1->Active)
ADOTable1->Open();
ADOTable1->Append();
ADOTable1->FieldByName("图形名")->AsString=OpenDialog1->FileName;
TBlobField *field=dynamic_cast<TBlobField *>(ADOTable1->FieldByName("图形"));
//field->LoadFromStream(stream);
field->LoadFromFile(OpenDialog1->FileName);
ADOTable1->Post();
ADOTable1->Close();
//-----------------------------------------------------
用TBlobStream
.h File
#include <jpeg.hpp>
.cpp File
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TQuery *Query=new TQuery(this);
Query->DatabaseName="all_ttmis";
Query->RequestLive=true;
Query->SQL->Clear();
Query->SQL->Add("select * from yourtable");
Query->Open();
Query->Edit();
TBlobField *pField=(TBlobField*)Query->FieldByName("Picture Field");
TBlobStream *pStream=new TBlobStream(pField,bmReadWrite);
Graphics::TBitmap *pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromFile("Your Jpeg File");
pBitmap->SaveToStream(pStream);
pField->LoadFromStream(pStream);
Query->Post();
delete pStream;
delete pBitmap;
delete Query;
.....
}
//自已可以对程序片段加以改进。
请问如何用流的方法向SQLServer数据库中读写blob的image字段
FanData->IRotL0->Position=0; //这个是TMemoryStream流
DataModule1->TbFanSeriesRotL0->LoadFromStream(FanData->IRotL0);
// 本来我是想用TADOBlobStream但是好象不行,后来我早模板上创建了TField对象
// DataModule1->TbFanSeriesRotL0,直接来存取
// 虽然是ACCESS但是我想应该是一样的
// 创建TField对象很简单,直接双击TTable,弹出对话框,右击弹出菜单选择全部,BCB便自动创建好。
读
//用BDE
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("Select * from sa_Signature");
Query1->Open();
TMemoryStream *pStream = new TMemoryStream();
Image1->Picture->Bitmap->Assign( (TBlobField *)(pStream) );
写
//用BDE写入
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("update dbo.sa_Signature set SignatureGp = :SignatureGp");
Query1->ParamByName("SignatureGp")->Assign(Image1->Picture->Bitmap);
Query1->ExecSQL();
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//先定义一Blob字段
TQuery *Query=new TQuery(this);
Query->RequestLive=true;
Query->DatabaseName="all_ttmis";
Query->Close();
Query->SQL->Clear();
Query->SQL->Add("select * from yourtablename");
Query->Open();
Query->Edit();
TBlobField *pField=(TBlobField*)Query->FieldByName("your blob Field");
pField->LoadFromFile(your filename);
Query->Post();
delete Query;
}
//====================================
//读 用到了TImage,你可以自己去掉组件,只用文件转化操作。
TGraphicField * pField = new (TGraphicField *)Table1->FieldByName("photo");
try
{
pField->SaveToFile("temp.bmp");
Image1->Picture->LoadFromFile("temp.bmp");
}
catch(...)
{
Image1->Picture->Assign(NULL);
}
//用存储过程修改,
TMemoryStream * pStream = new TMemoryStream();
Image1->Picture->Graphic->SaveToStream(pStream);
StoredProc1->ParamByName("@photo")->LoadFromStream(pStream,ftGraphic);
pStream->Clear();
delete pStream;
pStream = NULL;
//Table操作
TGraphicField * pField1;
TGraphicField * pField2;
TMemoryStream * pStream = new TMemoryStream();
pField1=(TGraphicField *)f_print_xx->Query1->FieldByName("climage");
pField1->SaveToStream(pStream);
pField2=(TGraphicField *)f_print_xx->Table1->FieldByName("climage");
pField2->LoadFromStream(pStream);
pStream->Clear();
delete pStream;
pStream = NULL;
取出来OK了,但是修改还是不成,我用以下进行修改
TMemoryStream *pStream = new TMemoryStream();
Image1->Picture->Graphic->SaveToStream(pStream);
我给Image1一张新的图片。
Query1->ParamByName("photo")->LoadFromStream (pStream,ftGraphic);
pStream->Clear();
delete pStream;
pStream = NULL;
Query1的SQL语句为
update table_name set photo = :photo
可能是这条语句不对,
或者用storeproce的话,存储过程的语句应该如何写呢?
//=======================================================
Q:如何在C++Builder中存取BLOB字段的数据?
A:如果你使用的是BDE的数据访问方式(不论你使用的是BDE的数据源还是ODBC的数据源)
你可以按照下面的代码来存取BLOB字段的数据:
//读
TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
TBlobStream * pmem=new TBlobStream(pField,bmRead);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromStream(pmem);
Image1->Picture->Assign(pBitmap);
delete pBitmap;
delete pmem;
//写
pQuery->Edit();
TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
TBlobStream * pmem=new TBlobStream(pField,bmWrite);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->Assign(Image1->Picture->Graphic);
pBitmap->SaveToStream(pmem);
delete pBitmap;
delete pmem;
pQuery->Post();
如果你使用的ADO的方式来访问数据库,你可以这样写:
//读
TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
TADOBlobStream* pmem=new TADOBlobStream (pField,bmRead);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromStream(pmem);
Image1->Picture->Assign(pBitmap);
delete pBitmap;
delete pmem;
//写
pQuery->Edit();
TBlobField * pField=(TBlobField *)pQuery->FieldByName("Image");
TADOBlobStream * pmem=new TADOBlobStream (pField,bmWrite);
pmem->Seek(0,soFromBeginning);
Graphics::TBitmap * pBitmap=new Graphics::TBitmap();
pBitmap->Assign(Image1->Picture->Graphic);
pBitmap->SaveToStream(pmem);
delete pBitmap;
delete pmem;
pQuery->Post();
存储图片的一段代码:
TBlobStream
.h File
#include <jpeg.hpp>
.cpp File
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TQuery *Query=new TQuery(this);
Query->DatabaseName="all_ttmis";
Query->RequestLive=true;
Query->SQL->Clear();
Query->SQL->Add("select * from yourtable");
Query->Open();
Query->Edit();
TBlobField *pField=(TBlobField*)Query->FieldByName("Picture Field");
TBlobStream *pStream=new TBlobStream(pField,bmReadWrite);
Graphics::TBitmap *pBitmap=new Graphics::TBitmap();
pBitmap->LoadFromFile("Your Jpeg File");
pBitmap->SaveToStream(pStream);
pField->LoadFromStream(pStream);
Query->Post();
delete pStream;
delete pBitmap;
delete Query;
.....
}
Top




