PB中保存图片
//****************************************************************
“选择”按钮代码:
lb_image = gf_open_pic(p_1,lb_image)
p_1.setpicture(lb_image)
//***************************************************************
“清除”按钮代码:
p_1.picturename = ''
p_1.picturename = ''//(清除控件图片此需要两次,这个我一直没弄明白为什么)
setnull(lb_image)
//***************************************************************
函数gf_open_pic:
//////////////////////////////////////////////////////////////////
//Add by Jeffrey Jiang on 2001.11.13
//选择图片
/////////////////////////////////////////////////////////////////
//Modfiy by Jeffrey Jiang on 2001.11.15
//当图片字节大于32765时,循环读图片
/////////////////////////////////////////////////////////////////
integer li_file,li_ret,loops,i
string ls_file,ls_path
blob lb_small
long flen,bytes_read,new_pos
//search the file
li_ret = getfileopenname("选择图片文件",ls_path,ls_file, &"BMP","图片文件
(*.BMP),*.BMP")
if li_ret = 1 then
p_1.picturename = ''
p_1.picturename = ''
setnull(lb_image)
if li_file <> -1 then
// Set a wait cursor
setpointer(hourglass!)
flen = filelength(ls_file)
li_file = fileopen(ls_path,streammode!,read!,lockread!) // Determine how many times to call FileRead if flen > 32765 then
if mod(flen,32765)=0 then
loops = flen/32765
else
loops = (flen/32765) + 1
end if
else
loops = 1
end if
// Read the file
new_pos = 1
for i = 1 to loops
bytes_read = fileread(li_file,lb_small)
if i = 1 then
lb_image = lb_small
else
lb_image = lb_image + lb_small
end if
next
// close the file
fileclose(li_file)
end if
end if
return lb_image
//***************************************************************
保存按钮代码:
UPDATEBLOB "person" SET "person"."PHOTO" = :lb_image WHERE "person"."C_ID" = :ls_c_id USING SQLCA; IF sqlcadoor.SQLNRows > 0 THEN
commit using sqlca;
END IF
//***************************************************************
显示图片:
lb_image = f_select_pic(ls_c_id)
p_1.setpicture(lb_image)
//***************************************************************
f_select_pic函数:
blob lb_image
setnull(lb_image)
selectblob "person"."PHOTO" into:lb_image from "person" where "person"."C_ID"=:ls_c_id using sqlca; return lb_image
//**************************************************************
//数据库的字段根据自己的需要更改~~~~~
//*************************************************************
//*****************************************************************************
有人问到,如何清除数据库中的图片而不删除该条记录,操作如下:
保存图片到数据库要用UPDATEBLOB:
UPDATEBLOB "M" SET "M"."PHOTO" = :ib_image
WHERE "M"."C_ID" = :ls_c_id ;
只删除图片而不删除记录要用UPDATE:
UPDATE "M" SET "M"."PHOTO" = null WHERE "M"."C_ID" = :ls_c_id ; (数据库字段根据自己的做更改~)
之前提供的gf_open_pic()函数说明:
由于PowerBuilder提供的fileread()函数每次只能读出字节小于32765的图片,当图片
大于32765时,我提供的gf_open_pic()函数循环读图片
如果你PB的版本是8,请升级到PB803,PB8对图片处理有BUG,
这仅仅是我使用过程中发现的,如果大家碰到图片保存不了,建议升级~
如果你的数据库是sql server 2000 保存图片程序就死了,请按照一下方法:
在你执行这个语句前加上这句看看:
sqlca.AutoCommit = Ture
updateblob table set pic=:lb_picture where id=:id using sqlca;
我按您的语句写的,如下:
UPDATEBLOB sqrz SET pic = null WHERE prvid=:ls_prvid and oprid=:ls_oprid and
rzdate=:ld_rzdate;
但是一保存就出下面的提示,不知为何,数据库中的该字段也是允许为空的,我的PB7.0+Sql
Server 2000,望赐,非常急!
晕~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我第一楼的帖子不是有解决
马,,,,,,,,,,,,,,,,,,,,
//*****************************************************************************
有人问到,如何清除数据库中的图片而不删除该条记录,操作如下:
保存图片到数据库要用UPDATEBLOB:
UPDATEBLOB "M" SET "M"."PHOTO" = :ib_image WHERE "M"."C_ID" = :ls_c_id ;
只删除图片而不删除记录要用UPDATE:
UPDATE "M" SET "M"."PHOTO" = null WHERE "M"."C_ID" = :ls_c_id ;
(数据库字段根据自己的做更改~)
对不起,版主,我没有看清,现在可以了,不过还有个问
,就是PB数据窗口中的Picture控件中的图片,在指向一个大于100K左右的文件是,出现非法操作,不知为何?
之前提供的gf_open_pic()函数说明:
由于PowerBuilder提供的fileread()函数每次只能读出字节小于32765的图片,当图片大于32765时,我提供的gf_open_pic()函数循环读图片
保存按钮代码:
UPDATEBLOB "person" SET "person"."PHOTO" = :lb_image
WHERE "person"."C_ID" = :ls_c_id USING SQLCA; IF sqlcadoor.SQLNRows > 0 THEN
commit using sqlca;
END IF
问一下版主,这个where 条件是什么啊,
pb6.5中怎么不认识sqlcadoor?
where使用你需要更新的记录所满足的条件
sqlcadoor 是我程序中的事务对象,你改成你的事务啊~默认的是SQLCA
昕晨,我用你的方法可以保存图片,但不知道为何从数据库中读出图片时却不行,不能显示,
不知道有什么地方不对,我用调试方法查看运行过程,blob变量不为空,证明是已经读出来
了,但用p_1.SetPicture(lb_pic)却显示不了。好郁闷。
UPDATEBLOB "person" SET "person"."PHOTO" = :lb_image WHERE "person"."C_ID" = :ls_c_id USING SQLCA; IF sqlcadoor.SQLNRows > 0 THEN //这一步你跟踪没有,是不是这里保存就失败了
在你执行这个语句前加上这句看看:
sqlca.AutoCommit = Ture
updateblob table set pic=:lb_picture where id=:id using sqlca;
成功了,原来是没有加SQLCA.AutoCommit=True,那么我想问一下,long binary倒底能保存
多大的图片,就是说字段长度为多少,
;replyid=50&id=50&page=1&skin=0&Star
=4