datawindow产生的SQL语句为什么不对?急救!
数据库是sybase asa12.5 ,并且总部设置了权限,对表的操作只能用"用户.表.列",这样的语法访问(如person.mycity.city)。我做了一个datawindow,格式正确,直接在pb里操作datawindow做插入、删除操作都没问题,就是运行程序时发现datawindow执行插入操作时产生的sql语句里没有带用户,系统提示无法找到表,导致插入数据失败。请各位指教!
以下为语句解释:
正确的插入语句应是:
insert into person.mycity (city,deptid)
value('023','011')
现datawindow产生的错误语句是:
insert into mycity (city,deptid)
value('023','011')
问题点数:50、回复次数:9Top
1 楼qltouming(缘木渔人-临渊羡鱼,不若退而结网)回复于 2005-02-18 09:01:04 得分 40
1、设置一全局变量,在程序一开始运行时即取到用户存入其中
2、在应用sql语句时,从全局变量用户名中取到值,用构造字符串方式组合成sql语句,
Top
2 楼dreamnow(梦想&现实)回复于 2005-02-18 09:29:38 得分 0
老大,你说的方法我想过,但如果多了是不是太麻烦了点,能否说说构造错误的原因并解决Top
3 楼qltouming(缘木渔人-临渊羡鱼,不若退而结网)回复于 2005-02-18 10:38:14 得分 0
和数据库设计有关,如果你在查询分析器中打开这个数据库要求你带用户前缀,那么程序代码中要执行的sql语句就必须带有用户名前缀。
如果经常用到也有不写前缀的方法可实现。方法是定义一事务对象连接该数据库(例:Sqlcw=create Transaction),在连接时指定该用户名。这样在代码中再写sql语句时要在最后加上use sqlcw,包括commit 或retrun 时都要加上。在事务对象使用完毕后要断开连接并清空。
disconnect using sqlcw;
destroy sqlcw;Top
4 楼dreamnow(梦想&现实)回复于 2005-02-18 12:16:16 得分 0
谢谢“缘木渔人”。
现已发现了原因,问题出在使用setsqlselect() 和dwobject.object.datawindow.table.select所得到的结果不一样,用dwobject.object.datawindow.table.select这样的格式系统就能正确构造sql语句,这点以后也请各位留意以下。Top
5 楼lzheng2001(1加1)回复于 2005-02-18 12:28:39 得分 10
setsqlselect()时 在表名前加上用户名应该也可以吧Top
6 楼dreamnow(梦想&现实)回复于 2005-02-18 13:06:43 得分 0
用setsqlselect()修改过datawindow后,在做insert,update等时就是有问题,帮助中提示用setsqlselect将改变select或update的校验信息,可能跟这有关Top
7 楼qltouming(缘木渔人-临渊羡鱼,不若退而结网)回复于 2005-02-18 13:11:06 得分 0
确实如此。如果在setsqlselect()后还要使用update()特性,需要重新指定。类似下列这种:
dw_1.modify("datawindow.table.updatetable = 'fwxx'")
dw_1.modify("fwxx_bh.update = yes")
dw_1.modify("fwxx_mc.update = yes")
dw_1.modify("fwxx_bh.Key = yes")Top
8 楼qltouming(缘木渔人-临渊羡鱼,不若退而结网)回复于 2005-02-18 13:17:28 得分 0
你也可以使用modify()函数来修改数窗,它不改变数据窗口对象的更新状态并用执行效率更高,原因在于它不验证sql语句的正确性,所以你要保证sql语句正确无误。Top
9 楼qltouming(缘木渔人-临渊羡鱼,不若退而结网)回复于 2005-02-18 13:19:06 得分 0
表意不明,修改一下:
你也可以使用modify()函数来直接修改数窗的sql语句(替代完成setsqlselect()的功能),它不改变数据窗口对象的更新状态并用执行效率更高,原因在于它不验证sql语句的正确性,所以你要保证sql语句正确无误。Top




