hur.cn - 华软网

 热门搜索

动态SQL纠错 急啊!帮忙啊!谢谢啊!高分求救!

  作者:未知    来源:网络    更新时间:2018/2/6
photo,为库中的一个blob字段,name 为字符串字段
在用如下语句更改表blobtest时

string m_name,m_id
prepare sqlsa
        from "update  blobtest   SET  name  = ?  WHERE  no = ?   ";
execute sqlsa using :m_name,:m_id;
执行成功了,可在用如下语句更新blob字段失败了,凡给看看
string m_id
blob m_photo
prepare sqlsa
        from "updateblob  blobtest   SET  photo  = ?  WHERE  no = ?   ";
execute sqlsa using :m_photo,:m_id;
------华软网友回答------
string m_id
string filename
prepare sqlsa
 from "update  blobtest   SET  photo  = xp_read_file(?)  WHERE  no = ?   ";
execute sqlsa using :filename,:m_id;
----------------
注意,没有blob,filename是函路径的文件名.希望你把错误信息给出来.

------华软网友回复------
飞:麻烦你讲的详细点,我很蠢的
------华软网友回复------
你的blob肯定是从文件中读上来的吧,你可以试一试直接用asa提供的存储过程来多,并且直接提交数据库。执行完sql,你看看sqlca.sqlcode是不是-1,然后把sqlca.sqltext打出来看看。
------华软网友回复------
我查了,没有出错信息,怎么回事?blob变量也给传递了blob参数了,麻烦再看看了,谢谢
------华软网友回复------
麻烦,我得回家了。我机器上没有asa,如果今天解决不了,只能等明天了。
------华软网友回复------
同样的变量和参数用常规sql执行都是成功的,所以没有出错信息,但用动态却不能更新呀,要不劳驾给举个用动态sql更新blob字段的事例吧
------华软网友回复------
别,急着呢,帮帮我啊!谢谢!

------华软网友回复------
动态SQL好象不支持blob类型的SQL. 想想别的方法实现吧
------华软网友回复------
您确定吗?没有别的办法,必须要用动态的,因为我所有的表名和字段及WHERE语句均是用变量组成的,我该怎么办?谢!

------华软网友回复------
你用什么数据库?
------华软网友回复------
asa,谢谢!
------华软网友回复------
asa不熟,你查一下ASA有没有专门的命令用来更新image字段吧, 我知道sql server就有.
------华软网友回复------
执行成功了,可在用如下语句更新blob字段失败了
string m_id
blob m_photo
prepare sqlsa
        from "updateblob  blobtest   SET  photo  = ?  WHERE  no = ?   ";
execute sqlsa using :m_photo,:m_id;
错误提示:
SQLSTATE = 37000
[Sybase][ODBC Driver][Adaptive Server Anywhere]Syntax error or access violation: near 'blobtest' in [blobtest] SET photo = ''烦再给看看,谢谢!特急!!!
------华软网友回复------
估计错误的可能性就是:
updateblob语句不是数据库的SQL语句,而是PB本身的语句,你这样相当于向ASA数据库提交updateblob语句,实际上asa并不知道updateblob是什么? 所以就会有错误.
------华软网友回复------
那如何怎样处理呢,能讲的细点吗?谢谢了,急呀!!
------华软网友回复------
对了,你用ASA的系统过程xp_read_file来返回文件的数据应该可以的
上面楼上提到的语句吧,应该行的

string m_id
string filename
prepare sqlsa
 from "update  blobtest   SET  photo  = xp_read_file(?)  WHERE  no = ?   ";
execute sqlsa using :filename,:m_id;

第一个?(参数)是文件名(含路径),第二个用于where 

说明: xp_read_file("c:\a.bmp") 返回了a.bmp的BINARY数据

------华软网友回复------
应该也可以写成这样
prepare sqlsa
 from "update  blobtest   SET  photo  = xp_read_file(" + ls_filename + ")  WHERE  no = ?   ";
execute sqlsa using :m_id;

也可以用第1种动态sql 格式来写
------华软网友回复------
用xp_read_file测试过了,没有更新成功,系统也没有提示任何错误,请继续给予帮助,谢谢!
------华软网友回复------
上面的语句少了引号,再改一下试试
prepare sqlsa
 from "update  blobtest   SET  photo  = xp_read_file('" + ls_filename + "')  WHERE  no = ?   ";
execute sqlsa using :m_id;

也有可能是文件路径或文件名写错了.再细心测试一下,应该行的

或者先从简单一点的SQL语句入手
execute immediate "update  blobtest   SET  photo  = xp_read_file('c:\1.bmp') WHERE  no = 100"
如果成功的话,自己再修改一上就可以达到你的要求了.

再有问题的话,可以发短信给我
------华软网友回复------
上面的SQL语句改一下,先把SQL语句存到变量中,这样才合法, 
ls_sql = "update  blobtest   SET  photo  = xp_read_file('" + ls_filename + "')  WHERE  no = ?   "
prepare sqlsa
 from :ls_sql;
execute sqlsa using :m_id;

------华软网友回复------
我快晕倒了,全部测试了,没有成功,用sqlerrtext也没有截取到错误信息,请你再看看谢谢!
------华软网友回复------

lzheng2001如何给你发短信呀,还希望你再指点指点,谢谢!
------华软网友回复------
我用这种方法测试成功了,你细心一点吧,肯定行的,1.要注意,文件名不要打错 2,要注意where 条件是不有记录符合. 再有问题可以发短信给我,点击我的名字就可以发了.

execute immediate "update  blobtest   SET  photo  = xp_read_file('c:\1.bmp') WHERE  no = 100"

------华软网友回复------
再不行,把你的语句贴出来,我帮你看看
------华软网友回复------
ls_sql = "update  blobtest   SET  photo  = xp_read_file('" + ls_filename + "')  WHERE  no = ?   "
prepare sqlsa
 from :ls_sql;
execute sqlsa using :m_id;
用这种方法测试也成功了,楼主准备结贴吧
------华软网友回复------
您的建议我动用了,执行结束后,用sqlerrtext也没有截取到任何错误信息。再将photo传递给blob变量ls_p,并用p_1.setpictrue(ls_p)时,ls_p是个空值,p_1也不显示图片,所以证明动态sql没有执行成功,深夜打扰,不好意思,给你添麻烦了,请在指点以下谢谢!!
------华软网友回复------
今天放假我上网玩玩吧,花点时间学习一下也不错,把你的语句贴出来看看.
------华软网友回复------
我分别用了:1、
string ls_sql,ls_filename
integer m_id
m_id = 1
ls_filename ='d:\1.bmp'
ls_sql = "update  blobtest   SET  photo  = xp_read_file('" + ls_filename + "')  WHERE  no = ?   "
prepare sqlsa
 from :ls_sql;
execute sqlsa using :m_id;
2、execute immediate "update  blobtest   SET  photo  = xp_read_file('d:\1.bmp') WHERE  no = 1";
去执行的;有劳你了!

------华软网友回复------
1.你的语句应该没有错,你确认表中已经存在no = 1这条记录吗?

2.用以下语句调试一下,有多少行数据被更新了
if sqlca.sqlnrows <> 0  then messagebox("updated rows",sqlca.sqlnrows)

3.如果功能你可以看到数据的
selectblob photo into :b from blobtest WHERE  no = 1;
if sqlca.sqlcode <> 0  then messagebox("test",sqlca.sqlerrtext)
messagebox("文件大小",len(b))

------华软网友回复------
再有问题的话,或者给个QQ号码,联系一下吧,尽快解决. 我食点消夜就睡了
------华软网友回复------
qq: 422161120,谢谢!,能够测试出文件的大小,证明已经更新了,可是photo对应的数据窗口中的ole database blob 列却不显示图片呢?可用普通的updateblob去更新ole database blob可是显示图片的,可见更新没有成功,烦你再给看看,谢谢了
------华软网友回复------
上线吧,我已经加你了
上面的例子中我用selectblob然后
p_1.setpicture(b)
能正常显示图片!我的图片是932k,不知是否有大小限制
------华软网友回复------
不好意思,刚才的qq我忘记了密码,能添373730784吗谢谢!
------华软网友回复------
执着的小伙子,一直弄到一点多。我回去测试了,使用asa提供的xp_read_file是可以的。

嵌入式sql语句是pb在sql上的一个统一,并且支持特定数据库中的存储过程以及函数;
动态sql语句是特定数据库的语法,所以,在使用时应该了解该数据库在具体操作上的语法。

该题目如果表名不是变量、字段名不是变量,你仍然可以使用嵌入式sql语句,如果上述两种
对象是变量那么就应该使用动态sql语句,并且对于asa你分明可以不使用blob而使用asa给出
的存储过程来实现,让数据库自己将数据从文件读出并保存在数据,既然知道asa可以这么做
就该活学活用。

如果使用嵌入式sql语句,你可以试一试在update之前将sqlca.autocommit设置成true。

------华软网友回复------
你昨天遇到的问题根本不是语句问题, 无论updateblob还是用asa存储过程,都是把原文件数据完整保存到数据库中, 而在dw中用ole update它会自动改变图片格式的,原文件数据已经改变,说到底就是ole图片编译器的问题!  你试试安装另一种图片编译器然后在dw中改变ole字段看行不
------华软网友回复------
飞:又出现如下问题利用动态SQL语句引语如下:
“update blobtest set photo  = xp_red_e('d:\1.bmp') where n=1”该语句执行成功,更新的photo字段,用selectblob普通的sql语句复给blob变量b ,再用p_i,setpicture(b)显示图片,但是数据窗口的ole_database_ole,却不显示图片,而用普通sql的updateblob更新的字段在数据窗口的ole_database_ole列完全可以显示!!!用普通sql的updateblob更新的字段再用用selectblob普通的sql语句复给blob变量b ,再用p_i,setpicture(b)时系统出错(用jpg,bmp,gif三种格式测试的结果均是提示)“not a jpeg :starts with oxdo oxcf”.请帮忙了兄弟谢谢各位了
------华软网友回复------
我来告诉你原因吧,你的updateblob 语句中的blob数据是从ole_1.objectdata 得来的,它实现上已经改变了原文件的数据格式,所以你用selectblob读出的数据已经不是原文件的数据,把以setpicture()时有错误!  
至于为什么可以在oledb中显示出来呢,原因很简单,因为数据库的数据是经过ole转化的,实际上dw中的ole与你窗口中的ole是同一个东西,当然支持自己的格式了.

解决方法:你试试安装另一种可以通过ole编译的图片编译器然后在dw中改变ole字段看行不

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