当前位置: 代码迷 >> PB >> updateblob有关问题
  详细解决方案

updateblob有关问题

热度:66   发布时间:2016-04-29 09:05:16.0
updateblob问题
integer li_file,li_ret,loops,i
string ls_file,ls_path,ls_coding
blob lb_small
long flen,bytes_read,new_pos
setnull(lb_image)
debugbreak()
ls_coding=dw_1.getitemstring(1,"coding")
ls_path=gs_path+ls_coding+".bmp"
ls_file=ls_coding+".bmp"
flen = filelength(ls_file)
li_file = fileopen(ls_path,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_file,lb_small)
if i = 1 then
lb_image = lb_small
else
lb_image = lb_image + lb_small
end if
next
fileclose(li_file)
p_1.setpicture(lb_image)
sqlca.autocommit = true
updateblob tbl_sickarchives set zwtz = :lb_image where coding = :ls_coding;
 if SQLCA.SQLCode = -1 then  
  MessageBox("提示","错误信息为:"+SQLCA.SQLErrText,Information!)  
end if
//p_1图片可以显示,但是更新失败,没有提示错误

------解决方案--------------------
update 成功后 你到表里去看这个字段是看不出来的

所以LZ还是得通过语句把这行的zwtz字段select出来看才行
------解决方案--------------------
1. 如果没有数据,Len(lb_img) 应该等于 0

2. update 后立即执行 commit,并检查 sqlcode 是否为 -1

3. 建议采用 sqlca.autocommit = false,这样多表更新时可以一次性提交以保证数据的一致性
------解决方案--------------------
一、selectblob zwtz into ...
这条语句执行完后,你的sqlca.sqlcode的值是多少,是否为100?
二、selectblob zwtz into ...
这条语句执行完后,弹出一下len(lb_img )
三、selectblob zwtz into ...
之前,加sqlca.autocommit=true
四、数据库采用的什么方式,ODBC or 专用接口?
------解决方案--------------------
这好像是pb早期版本出现的问题吧,你试着用pb高级版本编译一下看看
------解决方案--------------------
我记得以前我用pb6的时候遇到过这种问题,怎么解决忘记了!我也尝试了一下你的程序,在pb9里面都没问题,估计是你pb的版本太低!
------解决方案--------------------
我用 winxp_sp2 + mssql2000 + pb6.5 + odbc 测试没问题啊!

测试步骤如下:
1.安装 pb6.5,就是经典 build 444 那个,这没什么说的。

2.安装 mssql2000 专业版,完成后用企业管理器查看,发现只能管理表结构,一检索数据就会报“未知错误:8007700E”,不管它,不影响我在表里加 image 字段就行;字段默认长度是 16,这有点怪,我在 pb8 里也加过的,没见 image 有长度这东西,且不管它,就默认好了!

3.进控制面板添加“系统 DSN”,驱动选 sql server,验证方式选 sql server,其它基本上默认。

4.在 pb6.5 的 db profiles 画板里配置一个 odbc 方式的连接,完成后连接可以成功,但一打开 database 画板就报“S1003...程序类型越界”,这样的话就做不成数据窗口对象了,但测试只需要嵌入式 sql 能正常工作就可以,所以还是不管它(注:用 MSS 直连驱动没有这问题,但列标题全是问号,估计是前面数据库装得有问题造成的,升级到 pb6.5.1 可解决)!

5.找到 pbodb60.ini 中的 PBMaxBlobSize 设置,发现默认已设置为 2G,呵呵,所以就继续下一步。

6.用 pb8 的一个程序先向 image 字段放进一个 40k 的图片,再用 pb6.5 写一段代码读出到一个图片控件,成功!

楼主估计用的不是 pb6.5 吧,按理说应该升到 pb6.5.1 后数据库画板才能正常使用(除非不用数据窗口)。于是我又升到 pb6.5.1 测试了一下,依然正常。

另:6.5.1 是个机器码补丁,编译成 pbd 方式会不稳定,应编译成 dll
------解决方案--------------------
pb8 兄客气,我只是觉得 pb6.5 是最好用的版本了,数据库的版本又不是太高,只是 2000,而 6.5 是 98 年的,相差不过两年,兼容性不应差得这么厉害吧!又用楼主的代码测试了一下 6.5.1 写一个文件到 image,也是成功的,真是很奇怪他那里为什么不成功?
------解决方案--------------------
噢,是有点问题!用楼主的代码写入图片时,当图片放在 c 盘就是正常的,放到其它盘就不行。

问题可能出现在这:
ls_file=ls_coding+".bmp" 
flen = filelength(ls_file) 

ls_file 只是个相对路径,计算文件大小时是会有问题的,应该直接使用绝对路径:
flen = filelength(ls_path) 

------解决方案--------------------
探讨
噢,是有点问题!用楼主的代码写入图片时,当图片放在 c 盘就是正常的,放到其它盘就不行。

问题可能出现在这:
ls_file=ls_coding+".bmp"
flen = filelength(ls_file)

ls_file 只是个相对路径,计算文件大小时是会有问题的,应该直接使用绝对路径:
  相关解决方案