视图与表同步更新不了

wulongtianzi 2014-12-26 08:35:30
1、从一表中选取几个字段生成本地视图
2、在表单中用GRID控件浏览该视图
3、在表单运行时通过INSERT的语句在表中插入记录
4、视图中怎样才能同步显示更新后的表

查了N种解决办法,都没有解决,无奈插入时同时在视图中插入,当时可显示,但表中也同时插入了记录,头疼
...全文
609 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wulongtianzi 2014-12-27
  • 打赏
  • 举报
回复
没有人遇到过此类问题吗
十豆三 2014-12-27
  • 打赏
  • 举报
回复
或者好好看看视图的资料:VFP远程视图使用面面观
十豆三 2014-12-27
  • 打赏
  • 举报
回复
用不了视图就改用 SPT,请参考:
spt的全称为sql pass through,它是和远程视图构成了vfp处理远程数据的利器。和远程视图比较,它的主要好处在于灵活,可以直接连接远程数据库,并在服务器上执行代码代码,  当然它也可以和远程视图一样,通过一个光标cursor来更新远程数据,缺点主要是非图形化,代码量大。实际上远程视图是SPT的一个子集。  
 
步骤:  
   1、建立连接,或者连接句柄  
         如连接服务器为aa,用户名为bb,密码为cc,数据库为dd  
         nhandle=sqlstringconnect("driver=sql  server;server=aa;uid=bb;pwd=cc;database=dd")  
         if  nhandle>0  
               messagebox("数据库连接成功!",0,"提示")  
         else  
               messagebox("数据库连接失败!",0,"提示")  
         endif  
 
2、如何向服务器取数据  
     在第一步建立和服务器数据库的连接,并取得连接句柄nhandle后  
	sqlexec(jb,"select  *  from  tablename","cursorname")  
 
2、如何向服务器取数据  
     如向服务器表employees查询性别为男的人员  
     在第一步建立和服务器数据库的连接,并取得连接句柄nhandle后  
     sqlexec(nhandle,"select  *  from  employees  where  sex='男'","employees")  
     select  employees  
     brow  
       
   也可以调用系统上的存储过程来取得数据.  
   如在服务器建立存储过程  
     create  proc  getmanofworkes    
     as      
       select  *  from  employees  where  sex='男'  
       go  
 
   然后在vfp里调用  
     sqlexec(nhandle,"exec  getmanofworkes",employees)  
     select  employees  
     brow  
 
当然也可以想存储过程传递参数查询  
   仍然以刚才的例子,查询不同性别的员工  
   在服务器上建立create  proc  getemployees    
                               @sex  char(2)='男'  
                               as  
                                   select  *  from  employees  where  sex=@sex  
                                   go  
   vfp里调用  
         查询男员工  
         csex='男'  
         sqlexec(nhandle,"exec  getemployees  ?csex",'employees')  
         select  employees  
         brow  
         查询女员工  
           csex='女'  
         sqlexec(nhandle,"exec  getemployees  ?csex",'employees')  
         select  employees  
         brow 

&&sqlexec(handle ,'{ call YourProcedureName(param) }') &&在VFP中调用SQL存储过程的标准语法,此法可适用于任何以odbc连接的数据库.

 
这时brow得到的cursor你会发现,虽然修改了表中的数据,但服务器上并没有被更新.  
这是因为spt得到的光标默认是可写但不可更新的。  


VFP如何调用一个带输出参数的Sql Server存储过程?

如:我在Sql Server 中创建了一个存储过程
**********************************
CREATE  PROCEDURE usp_Test
@tnNum int,
@tnSQR int output
 AS
set @tnSQR = @tnNum * @tnNum

********************

在vfp中我要将8通过存储过程进行平方后写进变量lnSqr
该如何写,请补充下列代码

local lnSqlHandle,lnNum,lnSqr
lnSqlHandle = sqlconnect("mydate,"sa","")
lnNum = 8
lnSqr = 0
&&- 调用

&&- 结果需要lnSqr = 64
--------------------------------------
local lnSqlHandle,lnNum,lnSqr
lnSqlHandle = sqlconnect("mydate,"sa","")
lnNum = 8
lnSqr = 0
if lnsqlhandle<=0
	return
endif
succ=sqlexec(lnsqlhandle,"exec usp_Test ?lnnum,?@lnsqr")
&&注意在返回变量前加@
?lnsqr &&结果为64



 
设置本地表可更新服务器表  
 
sqlexec(jb,"select  id,bh,hyzhm,fzdw,rghsj,ghzrsj,xm,xb,gs_bm  from  rsda  where  lcbj=0  order  by  gbbh","gh")    
***设置gh可更新rsda表  
sele  gh  
cursorsetprop("tables","rsda","gh")  &&设置临时表的更新目标表  
cursorsetprop("keyfieldlist",'id',"gh")  &&设置临时表的关键字  
cursorsetprop("updatablefieldlist","id,fzdw,rghsj,ghzrsj,hyzhm","gh")&&设置临时表的更新字段  
cursorsetprop("updatenamelist","id  rsda.id,hyzhm  rsda.hyzhm,rghsj  rsda.rghsj,ghzrsj  rsda.ghzrsj,fzdw  rsda.fzdw","gh")  &&&用gh中的相应字段更新rsda表  
cursorsetprop("sendupdates",.t.,"gh")&&设置为可更新  
cursorsetprop("wheretype",2)  
cursorsetprop("buffering",5)&&设置表缓冲  
顺便提一下,表缓冲必须有明确的tableupdate命令才能更新。  
上面的功能都是通过本地的cursor来处理远程数据。spt还可以直接处理远程数据。  
如将远程服务器上的表rsda中,性别为男的,都改成女的。  
sqlexec(nhandle,"update  rsda  set  xb='女'  where  xb='男'")&&由于这句是更新命令,不需要返回一个记录集,所以,第三个参数,光标名可以省略不写。  
 
由此也就可以举一反三的明白,如何调用远程存储过程来更新数据了。  
如将上面的更新语句写成存储过程  
   在服务器上  
         create  proc  updatesex    
           as    
           update  rsda  set  xb='女'  where  xb='男'  
           go  
vfp调用  
         sqlexec(jb,"exec  updatesex")&&调用存储过程,不需要返回光标,取消第三个参数  
如何开始一个远程事务  
     事务它包含一个可回滚的操作段。在sql server上在事务中的数据,并没有实际的写入数据库,而是将更新临时存储在缓冲中,只有明确的发出了commit或者rollback  tran才结束这个事务,将操作取消或者将操作实际写入。  
   每个事务以begin  tran开始,以commit  tran或者rollback  tran结束。倘若在遗漏了commit  tran或者rollback  tran,在sql  server就很容易的表现为等待状态,即死锁状态,在等待该事务的释放。  
   开始一个事务:  
       sqlexec(nhandle,"begin  tran")&&开始一个事务,事实上sqlexec()中的第二个参数中的操作都是被发送到sql  server执行的。这样也就可以理解存储过程的一个优点,因为存储过程只要发送一个调用语句给服务器,而如果将这些语句全部写在VFP端,则带来的网络传送量必然很多,客户端越多,造成网络阻塞的可能就越大。回到事务上来。  
       sqlexec(nhandle,"insert  into  tablename  values()")  
       sqlexec(nhandle,"if  @@error<>0")  
       sqlexec(nhandle,"begin")  
       sqlexec(nhandle,"rollback  tran")  
       sqlexec(nhandle,"return")  
       sqlexec(nhandle,"end")  
       sqlexec(nhandle,"delete  from  tablename  where  ")  
       sqlexec(nhandle,"if  @@error<>0")  
       sqlexec(nhandle,"rollback  tran")  
       sqlexec(nhandle,"else")  
       sqlexec(nhandle,"commit  tran")  
当然在vfp8中可以写成text  endtext的形式更加直观  
 
不过我个人感觉,有事务处理的处理还是最好写成过程。例在服务器上建立过程  
 
create  proc  procname    
as    
   begin  tran  
       insert  into  tablename  values()  
       if  @@error<>0  
             begin    
               rollback  tran  
               return  
             end  
     delete  from  tablename  where    
     if  @@error<>0  
           rollback  tran  
     else  
           commit  tran    
           
在vfp端sqlexec(nhandle,"exec  procname")  
当然也可以开启服务器事务:  
*  开始一个  VFP  事务处理和一个服务器上的事务处理.  
nConnection=CursorGetProp("ConnectHandle","mytable")  
SQLExec(  nConnection,  'BEGIN  TRANSACTION'  )  
*  更新修改到  MyTable.  
lEverythingOK  =  Tableupdate(  2,  .F.,  'mytable'  )  
If  lEverythingOK  
*  更新修改到  MyOtherTable.  
           lEverythingOK  =  Tableupdate(  2,.F.,'MyOtherTable')  
endif  
*  结束服务器上的和  VFP  的事务处理.  
If  lEverythingOK  
           SQLExec(  nConnection,  'IF  @@TRANCOUNT  >  0  COMMIT'  )  
           End  Transaction  
           Messagebox('数据保存成功!',64,'提示',2000)  
Else  
           SQLExec(  nConnection,  'IF  @@TRANCOUNT  >  0  ROLLBACK'  )  
endif  

2,722

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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