一个vfp5 + sqlserver7.0 的大容量数据库刷新问题

近日,我在将一套以前我开发的vfp系统升级到sql7.0平台中遇到了问题,特请教。
当我用sqlconnect ,sqlexec等函数连接数据库成功后,服务器端5000条记录的下载也不见的有多快,可能是我的字段很多的缘故,在记录新增后,我用sqlcommit提交了事务,成功的insert 了记录,然而客户端的临时表并没有自动反映过来,仍为就记录,我想立即让其体现出来,可总不会用户每次新增后都下载一次吧?于是我想到了refresh()函数,可是它却提示:
临时表指定有错误,请使用临时表的tables属性?
请问,这是为什么?难道refresh()函数只能刷新cursor?
这样的情况该如何解决(大容量数据[将来有可能达到10万以上]的刷新)?
我用vfp5.0 +sqlserver7.0

---------------------------------------------------------------

本来就不能自动反映吧,因为你的临时表是已经下载到本地来的,而你用sqlexec是直接更新了服务器的数据,并不会改变临时表的数据
---------------------------------------------------------------

重新下载肯定不好,如果这样的话,你最好把临时表也insert一次

或者,你可以不用sqlexec更新,当临时表下载到客户机后,直接操作临时表,然后用tableupdate()更新临时表,不过这样你必须先对临时表进行一些CURSORSETPROP()设置

再则,可以用视图
---------------------------------------------------------------

在表结构上先下点功夫,比如加上年月的标志,然后在远程视图取数时带上年月参数,让当月的数据出现在前台,这样,速度才能有更好的解决,重新读数是用REQU()这个函数。
---------------------------------------------------------------

给你个例子;
function mysetprop(tabname,curname,curkey,curfield,updatename)
CURSORSETPROP("TABLES",tabname,curname)
CURSORSETPROP("KEYFIELDLIST",curkey,curname)
CURSORSETPROP("UPDATABLEFIELDLIST",curfield,curname)
CURSORSETPROP("UPDATENAMELIST",updatename,curname)
CURSORSETPROP("SENDUPDATES",.T.,curname)
ENDFUNC
*tabname是指SQL数据库里的表名字
*curname是用sqlexec()得到的临时表名字
*curkey是临时表主键
*curfield中临时表有字段名列表
*updatename是要更新的字段名

*调用
IF myselect("Select name,password from password ","sqluser")
mysetprop("password","sqluser","name","name","name password.name")
DO FORM &syspath\forms\modi_username
else
mymessage('notopen')
endif

表单command的click
WITH thisform
sele sqluser
if !allt(sqluser.password)==allt(.text1.value)
MESSAGEBOX('密码不正确,你无权修改该用户名!',16,'错误')
.text1.setfocus
RETURN
endif
begin transaction
REPLACE name WITH ALLTRIM(.text2.value)
IF tableupdate()
end transaction
else
ROLLBACK
mymessage('myupdate')
RETURN
endif
ENDWITH

Published At
Categories with 数据库类
comments powered by Disqus