vfp如何使用spt

问题内容:vfp如何使用spt

  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=2106887
  • 所属论坛:VFP     审核组:其他数据库开发
  • 提问者:liujianjun_     解决者:liujianjun_
  • 感谢:newfang
  • 关键字:
  • 答案:

    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 ?sex",'employees')
         select employees
         brow
         查询女员工
          csex='女'
         sqlexec(nhandle,"exec getemployees ?sex",'employees')
         select employees
         brow
    这时brow得到的cursor你会发现,虽然修改了表中的数据,但服务器上并没有被更新.
    这是因为spt得到的光标默认是可写但不可更新的。

    设置本地表可更新服务器表

    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
    * 更新修改到 MyOtherTab

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值