CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  数据库及相关技术

用TQuery控件从数据库返回的图片无法正常显示??!!高手赐教

楼主gaoxin(打掉牙,和吞血)2002-10-20 15:50:46 在 C++ Builder / 数据库及相关技术 提问

我开始是用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

相关问题

  • Tquery 控件可不可以同时和多个数据库相连?
  • 数据库编辑控件
  • 数据库控件问题
  • ExecuteReader返回一个SqlDataReader和控件绑定,请问数据库连接是在什么时候关闭的?
  • 用Tquery控件做数据库程序,在用insert语句时有问题,具体请进!
  • 关于TQuery,TUpdateSQL几个控件联合使用来缓冲更新数据库的问题!
  • 急需数据库备份控件,Paradox数据库(D5)
  • 数据库控件TTable的问题!
  • Delphi数据库控件使用方法
  • data控件和Foxpro数据库

关键词

  • 数据库
  • 字段
  • pstream
  • pbitmap
  • pfield
  • tblobfield
  • pmem
  • tblobstream
  • query
  • tbitmap

得分解答快速导航

  • 帖主:gaoxin
  • winkiky
  • oyxiaoyu0
  • tony808
  • bigwhiteshark

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo