再次散掉所有家当: 一个非常郁闷的问题!不知是不是PB的bug 请大家发表一下看法 !!

老板卤两个蛋蛋 2005-12-16 09:50:08
其实是个老问: 一个图片处理问题:

=============================================================
我上传脚本是
=========================================================
///* 用大文本处理
long ll_row

ll_row = dw_1.getRow ()
if ll_row < 0 then return

gs_zh = dw_1.getItemString (ll_row, "幢号")
gs_dy = dw_1.getItemString (ll_row, "单元")
gs_lc = dw_1.getItemString (ll_row, "楼层")
ls_fh = dw_1.getItemString (ll_row, "房号")

String ls_FileName, ls_pathName, ls_currDir
int li_ret, li_filePtr, li_loops, i
long ll_fileLen, ll_bytes_read, ll_new_pos
blob lbb_read, lbb_total

ls_currDir = getCurrentDirectory () //当前路径


li_ret=GetFileOpenName("选择图片文件",ls_pathname,ls_filename, "jpg", &
"JPG文件(.jpg),*.jpg,BMP文件(.bmp),*.bmp" )
changeDirectory (ls_currDir)

IF Li_ret <= 0 then return
//messageBox ('', '')
setPointer (hourGlass!)
li_filePtr = fileOpen (ls_pathName, STREAMMODE!, READ!, Shared!)
if li_filePtr <> 1 then
messageBox ("错误", "打开图形文件失败!", stopSign!)
return
end if

ll_fileLen = fileLength (ls_pathname)
if ll_fileLen > 32766 then
li_loops = long ((ll_fileLen - 1)/32766) + 1
else
li_loops = 1
end if
messageBox (string (ll_fileLen) , string (li_loops) )
for i = 1 to li_loops step 1
ll_bytes_read = fileRead (li_filePtr, lbb_read)
lbb_total = lbb_total + lbb_read
ll_new_pos = ll_new_pos + ll_bytes_read
fileSeek (li_filePtr, ll_new_pos, FROMBEGINNING!)
next
FileClose (li_filePtr)

sqlca.autocommit = true
UPDATEBLOB 楼盘信息
SET 户型图 = :lbb_total
WHERE 幢号 = :gs_zh AND
单元 = :gs_dy AND
楼层 = :gs_lc AND
房号 = :ls_fh
USING SQLCA;
if SQLCA.SQLCode = 0 then
commit using sqlca;
messageBox ("提示", "保存图片成功!")
else
rollback using sqlca;
messageBox ("数据库错误", "保存图片失败!~r~n~r~n错误代码:" + &
string (sqlca.sqlDbCode) + "~r~n详细信息:" + &
sqlca.sqlERRText, stopSign!)
end if
sqlca.autocommit = false

=============================================================
读图片的脚本是:
==============================================================
/* 用大文本处理*/
long ll_row

ll_row = dw_1.getRow ()
if ll_row < 0 then return

gs_zh = dw_1.getItemString (ll_row, "幢号")
gs_dy = dw_1.getItemString (ll_row, "单元")
gs_lc = dw_1.getItemString (ll_row, "楼层")
ls_fh = dw_1.getItemString (ll_row, "房号")
//open (w_ckhxt)

//显示图片 - 用大文本处理 - 使用系统打开方式
blob lbb_pic, lb_temp

setpointer (hourGlass!)
sqlca.autocommit = true

SELECTBLOB 户型图
INTO :lbb_pic
FROM 楼盘信息
WHERE 幢号 = :gs_zh AND
单元 = :gs_dy AND
楼层 = :gs_lc AND
房号 = :ls_fh
USING SQLCA;
sqlca.autocommit = false

if SQLCA.SQLCode <> 0 then
messageBox ("数据库错误", "读取户型图失败!~r~n~r~n错误代码:" + &
string (sqlca.sqlDbCode) + "~r~n详细信息:" + &
sqlca.sqlERRText, stopSign!)
else
if len (lbb_pic) > 0 then
long ll_handle, ll_fileLen, i, ll_loops

ll_handle = FileOpen("Temp.jpg",StreamMode!, Write!, lockWrite!, replace!)
ll_fileLen = len(lbb_pic)
if ll_fileLen > 32766 then
ll_loops = long ((ll_fileLen - 1)/32766) + 1
else
ll_loops = 1
end if
messageBox (string (ll_fileLen) , string (ll_loops) ) //
For i=1 to ll_loops step 1
lb_temp = Blobmid(lbb_pic,(i - 1)*32765+1,32765)
filewrite(ll_handle,lb_temp)
Next
FileClose(ll_handle)
//打开
ShellExecute(handle(this), '', "Temp.jpg", "shell32.dll", '', 0)
else
messageBox ("提示", "还未上传户型图!", exclamation!)
end if
end if
setPointer (arrow!)
======================================================================


脚本其实都不用大家仔细看了,基本都是通常的处理方法 ,
问题:是我用ODBC连接时,在上传能全部上传(messageBox显示循环次数), 而在读取图片的时候不关怎么样都只能读取 32767字节 (messageBox提示),调式了老半天硬没找出错误,

刚才实在没办法了,才抱着试一试的心态,把连接方式改为直连(mss),却突然行了
但现在MSS连接方式行了,却存在其他问题,如:
SELECT "密码", "姓名"
INTO :ls_pwd, :ls_userName
FROM "Y系统用户"
WHERE "ID" = :ls_userId
USING sqlca;
如果在字段两端加上引号用mss连接会出现语法错误(而odbc连接则不会有错误),而偏偏我为了做区分,我一般都加了引号,真是郁闷至极!!
我就打算就将读取图片的连接方式改为MSS连接算了,因为程序里只有一个地方用要读图片!

================================================
我在网上搜索了一下,被图片搞郁闷了的人好真不少 :),所以在百忙之中发出此贴供大家分享(现在真的很忙,一般周末都没得休息)

现在请大家再讨论一下:

1:ODBC下读图片只能读32K是不是PB的BUG;
2:究竟ODBC连接和MSS连接以及OLE DB有些什么区别,具体什么时候用什么连接??

(全部家当就179分了)
...全文
240 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
j9dai 2005-12-19
  • 打赏
  • 举报
回复
ODBC是这样子
lovelihp 2005-12-19
  • 打赏
  • 举报
回复
代码太长了,我太懒 :)
lzheng2001 2005-12-19
  • 打赏
  • 举报
回复
说明一下,楼主直连方式在外网连入的话,SERVERNAME请用IP地址连接!
jimmyxc 2005-12-18
  • 打赏
  • 举报
回复
flen = FileLength(ls_name)

li_FileNum = FileOpen(ls_name, &
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_FileNum, b)

tot_b = tot_b + b

NEXT

FileClose(li_FileNum)
/////
id=this.getitemnumber( row, "IMAGEMODLE")
UPDATEBLOB T_IMAGEMODLE
SET MODLEIMAGE=:tot_b
WHERE IMAGEMODLE=:id
using sqlca;
commit;
、、、、、
blob字段在PB里面可以直接“+”,你的方法也行,效果一样的
xyqiqi 2005-12-17
  • 打赏
  • 举报
回复
楼上的,用第二个好像也可以,我用过。
lzheng2001 2005-12-17
  • 打赏
  • 举报
回复
的确,以前听说过有网友说用ODBC连不行,我一直没有做过测试,因为我都是用直连的,你用什么版本的PB? 最好先打上PB的补丁,或许问题就解决了.
  • 打赏
  • 举报
回复
to 1+1:

MSS连接方式连接我本机的SQL没问题,连接一个挂在外网上的SQL就说“登陆不正确”,但是我用ODBC能连接上,所以不是密码错误了(不知道是不是他的SQL没打补丁,我的一个合作伙伴,他不SQL挂在外网上的,暂时还没和他取得联系)

连外我发现用ODBC连接和MSS连接,在PB中存储过程的申明明显不一样,如同一存储过程:
ODBC连接只能这样:
DECLARE p_getALTAUTHRT PROCEDURE FOR p_getAlterAuthority
(:as_tacheName,
:as_tabName,
:as_colName )
USING SQLCA;

而MSSl连接就需要这样:
DECLARE p_getALTAUTHRT PROCEDURE FOR p_getAlterAuthority
@tacheName = :as_tacheName,
@tabName = :as_tabName,
@colName = :as_colName
USING SQLCA;
==================================================
被搞郁闷了 ~~~~~~~~~~~~~~~~~~~~~




lzheng2001 2005-12-17
  • 打赏
  • 举报
回复
1.pb9.0 5507 版本还是比较旧,请试试更新的版本,如 pb9.03 xxxx

2.端口可以是任意的可用端口. 你可以"服务器网络实用工具"中设置,没什么其它特殊的设置就可以连了

3.“登陆不正确”是登录的用户名不正确造成的,检查一下SQLCA中的userid项吧
  • 打赏
  • 举报
回复
PB是9.0 5507 打了补丁, sql server 2000 打了sp3补丁
看来也可能不是PB或SQL的问题

不过远程直连有时候会出现“登陆不正确”的错误
请问一下,直连要注意些什么,比如是不是端口必须是1433, SQL要做些什么特殊的设置没有?
hygougou 2005-12-17
  • 打赏
  • 举报
回复
odbc没法用这个特性,还有调用存储过程也有问题


用直连或者OLE吧,速度也快些
zw3214 2005-12-17
  • 打赏
  • 举报
回复
图片大于32k好像要分块读!好像不光图片,我这里有本资料说,通过串口读某些硬件上的数据都是32k都传
jimmyxc 2005-12-17
  • 打赏
  • 举报
回复
我经常用PB读大文件,asa和ORACLE都用过,用循环读取都没有问题,用的9。0,数据库脚本字段一般来说是不用加引号的,你可以用PB自带的SQL脚本图形界面生成SQL语言,至于直连还是ODBC我觉得直连比较好
lw1a2 2005-12-16
  • 打赏
  • 举报
回复
好像大于32K的必须分块循环解决

754

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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