请教 BLOB数据 显示的问题(涉及 VB5 ADODC MSSQL7 DELPHI)

xh1 2001-06-27 01:27:04

我有一个ACCESS MDB的数据库,在VB5下用adodc存放了一些图像的,在VB下,用picture控件能正常显示和使用。
最近想升级系统 ,将数据库升迁SQL7下,转为用Delphi开发。
可是,用VB的ADODC存在blob中的图像好像不能在Delphi下识别,这是什么原因,应该怎么进行转换?

注:我用jpeg 和 bmp 两种显示方法在Delphi中都试过了,都不行,好像VB的ADODC在存放blob图片时做了一些格式转换,以至Delphi不能显示VB存放的blob图片。

...全文
116 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xh1 2001-06-28
  • 打赏
  • 举报
回复
我刚才又测试了一下,看来给分给早了。 ;)

BlueTrees(蜗牛)兄说的不是很正确吧?

我在Delphi中存在BMP和GIF的图片到MDB中,在VB都能正常显示的。
xh1 2001-06-28
  • 打赏
  • 举报
回复
看来 是没有比较省事的解决办法了。 :)
BlueTrees 2001-06-28
  • 打赏
  • 举报
回复
主要原因:Delphi在储存Blob数据时会加上一个Delphi自定义的数据头,指出这个Blob数据的类型,你用VB储存的Blob数据Delphi当然无法判定这个数据的类型,也就无法正确的显示图片了,解决的方法是自己先编一个小程序来转换,具体实现的方法可以参考TDBImage的源代码,不是很难!关键我不知道VB在存储数据时是否也加上了他自己的数据头!
xh1 2001-06-27
  • 打赏
  • 举报
回复
我用JPG GIF 格式都试了,VB的ADOdc存在ACCESS的blob中的图像不是这两种格式,

难道就没有办法在Delphi中直接显示了吗?????
cobi 2001-06-27
  • 打赏
  • 举报
回复
gz
xh1 2001-06-27
  • 打赏
  • 举报
回复
sephil 谢谢您的帮助,可惜我Delphi初学,BCB更是一窍不通。

如果您能给出Delphi下的代码就好了。最关键的是我不能用DBImage显示出

由VB5下ADODC存放在ACCESS数据库中的Blob字段的图片。在Delphi下存入和

显示我都可以做到了的,遇到这个VB存入的Blob,就卡壳啦 :)
Sephil 2001-06-27
  • 打赏
  • 举报
回复
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);
FANGAO 2001-06-27
  • 打赏
  • 举报
回复
应该可以呀, 用DBImage控件. 我在BCB, Delphi下都用过

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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