我的表结构Testpic(id char(2), pic Image )
保存图片的程序如下,但是每次运行只能插入该信息的ID 字段,而在插入图片的时候,程序总是感觉死掉了。这是怎么回事??好心人帮一下啦:))
string ls_docname, ls_named, ls_list_code
integer li_value, li_cnt,li_loop,li_counter,li_filenum
blob lb_pic,lb_our_pic
long ll_filelen,ll_bytes_read,ll_new_pos
//显示一个打开文件的对话框
li_value = GetFileOpenName("选择图象文件", &
+ ls_docname, ls_named, "JPG", &
+ "JPEG files (*.JPG),*.JPG," &
+ "BMP files (*.BMP),*.BMP," &
+ "Windows metafiles (*.WMF),*.WMF," &
+ "GIF Files (*.GIF),*.GIF")
IF li_value <> 1 THEN
return
end if
//获得文件的大小
ll_filelen = FileLength(ls_docname)
//获得文件的句柄
li_filenum = FileOpen(ls_docname, StreamMode!,READ!,LOCKREAD!)
if li_filenum = -1 then
MessageBox(提示信息, 打开文件+ls_docname+失败)
end if
//因为FileRead函数只能获得32765长度,因此需要判断循环次数
IF ll_filelen > 32766 then
li_loop = ((ll_filelen - 1)/32766)+1
else
li_loop = 1
end if
//读取图象文件到Bolb变量中
for li_counter = 1 to li_loop
ll_bytes_read = FileRead(li_filenum, lb_our_pic)
lb_pic = lb_pic+lb_our_pic
ll_new_pos = ll_new_pos + ll_bytes_read
FileSeek(li_filenum,ll_new_pos,FROMBEGINNING!)
next
FileClose(li_filenum)
//将图像文件显示到图片控件中
p_cover.picturename = ls_docname
//将图像存入数据库
//ls_list_code = dw_1.getitemstring(dw_1.getrow(),"id")
ls_list_code = sle_1.text
select count(*) into :li_cnt from testpic where id= :ls_list_code;
if li_cnt = 0 then
insert into testpic(id) values (:ls_list_code);
IF sqlca.sqlcode <> 0 THEN
MessageBox(提示信息, 存盘失败+sqlca.sqlerrtext)
rollback;
else
commit;
end if
end if
UPDATEBLOB testpic SET pic = :lb_pic WHERE id = :ls_list_code;
IF sqlca.sqlcode <> 0 THEN
MessageBox(提示信息, 存盘失败+sqlca.sqlerrtext)
rollback;
else
commit;
MessageBox(提示信息, 存盘成功)
END IF
FileRead()函数读取出的是字符串,需要转换成Blob类型
lb_pic = lb_pic+lb_our_pic 后面一个变量是不是有问题,类型不对哦.
lb_pic = lb_pic + blob(ls_read) //自己定义一个ls_read,保存FileRead的字符串内容
我用SqlServer试了一下,可以保存成功的,没什么问题。但没有把数据取出来验证一下。
程序总是感觉死掉了?
你可以用PB的端点跟踪功能,跟踪一下
//从文件中读取图片
integer li_FileNum, loops, i
long flen, bytes_read, new_pos
blob b, tot_b
flen = FileLength(sle_filename.Text)
li_FileNum = FileOpen(sle_filename.Text, &
StreamMode!, Read!, LockRead!)
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
new_pos = 1
FOR i = 1 to loops
bytes_read = FileRead(li_FileNum, b)
tot_b = tot_b + b
NEXT
FileClose(li_FileNum)