hur.cn - 华软网

 热门搜索

PB存取二进制文件问题

  作者:未知    来源:网络    更新时间:2018/1/1
请教高手:为什么把图片存入的数据库image类型的字段,大于32k的图片取出时总是发生程序总是死掉:
1、数据库采用ms sqlserver 2000 的数据库,数据类型用image
2、已建主键
updateblob语句没有发生错误,但是对于大于32k的图片,selectblob语句提取image数据后,用len函数计算长度总是显示32737,应用setpicture()马上死掉,小于32k的图片正常。
------华软网友回答------
大于32k的文件你是怎么样存入的
读大于32k的文件的时候要分段读取的
可能是你存入数据库的时候就没有完全存入
------华软网友回复------
程序如下:
update:
string ls_pic1name = "d:\violation\bitmap\showimg.jpg"
integer li_FileNum, loops, i
long flen, bytes_read, new_pos
blob b, tot_b
// Set a wait cursor
SetPointer(HourGlass!)
// Get the file length, and open the file
flen = FileLength(ls_pic1name)
li_FileNum = FileOpen(ls_pic1name,StreamMode!, Read!, LockRead!)

// Determine how many times to call FileRead
IF flen > 32766 THEN
   IF Mod(flen, 32766) = 0 THEN
      loops = flen/32766
   ELSE
      loops = (flen/32766) + 1
   END IF
ELSE
   loops = 1
END IF

// Read the file
new_pos = 1
FOR i = 1 to loops
    bytes_read = FileRead(li_FileNum, b)
    tot_b = tot_b + b
NEXT
FileClose(li_FileNum)

long ll_id
ll_id = dw_1.getitemnumber(dw_1.getrow(),"id")
SQLCA.AutoCommit = true
updateblob test set pic1 =:tot_b
where id = :ll_id;
if sqlca.sqlcode <> 0 then
messagebox("保存失败",sqlca.sqlerrtext,information!)
end if

SQLCA.AutoCommit = False

取出来:
long ll_id
blob lb_our_blob

ll_id = dw_1.getitemnumber(dw_1.getrow(),"id")

SQLCA.AutoCommit = true
selectblob pic1 into :lb_our_blob from test
where id = :ll_id;
if sqlca.sqlcode = 0 then
if isnull(lb_our_blob) or len(lb_our_blob) = 0 then
else
messagebox("",len(lb_our_blob))
p_1.setpicture(lb_our_blob)
end if
else
messagebox("",sqlca.sqlerrtext)
end if
SQLCA.AutoCommit = false

 






------华软网友回复------
//将图片文件写入数据库
li_rc = fileopen(is_filepath,StreamMode!, Read!, LockRead!)  //用流模式打开图片文件
if li_rc>0 then
for li_j=1 to li_loop
ll_flength=fileread(li_rc,blb_temp)
if li_j=1 then
blb_word=blb_temp
else
blb_word=blb_word+blb_temp
end if
ll_newpos=ll_newpos+ll_flength
fileseek(li_rc,ll_newpos,FROMBEGINNING!)
next
fileclose(li_rc)
end if

//保存图片
sqlca.autocommit=true
updateblob tablename set photo=:blb_word where id=:li_id;
sqlca.autocommit=false
------华软网友回复------
回wuyou88,这种方式我也试过,同样不行。
在update最后我p_1.setpicture(tot_b)是正常的,说明能够在数据库中存入大于32k的数据

     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。