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

SPT的全称为sql pass through相关推荐

  1. SQL PASS将于8月24日在北京中医药大学举办线下活动

    活动主题:复制架构的实现和调优以及SQL Server BI在传统行业的应用 地点:北三环东路11号 北京中医药大学 白色的1号楼教学楼后楼5层511房间 时间:2013年8月24日 9:00-12: ...

  2. Oracle中的AWR,全称为Automatic Workload Repository

    Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库.它收集关于特定数据库的操作统计信息和其他统计信息,Oracle以固定的时间间隔(默认为1个小时 ...

  3. SQL PASS西雅图之行——University of Washington篇

    11月9日,会议的安排一如既往的紧凑,不过为了老婆大人的嘱托,我还是在听了一场"Advanced SQL Server Troubleshooting"后,就偷偷溜号了:我要去的是 ...

  4. oracle+pim+全称,CSS_Oracle ASM自动管理存储管理简介,1 什么是ASMASM全称为Automa - phpStudy...

    Oracle ASM自动管理存储管理简介 1 什么是ASM ASM全称为Automated Storage Management,即自动存储管理,它是自Oracle10g这个版本Oracle推出的新功 ...

  5. AJAX工作原理及其优缺点 1.什么是AJAX? AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页

    参考文章:https://www.cnblogs.com/SanMaoSpace/archive/2013/06/15/3137180.html AJAX工作原理及其优缺点 1.什么是AJAX? AJ ...

  6. 最全的SQL注入总结

    SQL注入原理 当客户端提交的数据未作处理或转义直接带入数据库,就造成了sql注入. 攻击者通过构造不同的sql语句来实现对数据库的任意操作. SQL注入的分类 按变量类型分:数字型和字符型 按HTT ...

  7. (上)史上最全 Flink SQL 成神之路(全文 18 万字、138 个案例、42 张图)

    1.前言 看了那么多的技术文,你能明白作者想让你在读完文章后学到什么吗? 大数据羊说__的文章会让你明白 博主会阐明博主期望本文能给小伙伴们带来什么帮助,让小伙伴萌能直观明白博主的心思 博主会以实际的 ...

  8. 西雅图SQL PASS之旅

    Professional Association for SQL Server (PASS)是一个独立非盈利的组织,致力于支持,教育和推广SQL社区.同时每年一度的PASS Summit是SQL Se ...

  9. mysql数据库诊断_RDS MySQL 数据库全量SQL诊断

    三大难点问题 使用MySQL数据库的用户,不可避免都会遇到下面三个难题: 1.历史问题难定位 数据库凌晨3点发生了CPU 100%的告警,但是该时间段却没有任何慢SQL,怎么继续查找原因? 2.SQL ...

最新文章

  1. python 实时显示声音
  2. Uuntu 20.04 install OpenLDAP
  3. 已经入门了C++,后面的路怎么走?
  4. 【数据结构与算法】之N个数中有K个数可能的组合算法
  5. Redis-字符串(string)基础
  6. 日语输入法电脑版_如何安装日语输入法?(手机/电脑安装使用指南)
  7. 微型计算机如何开声音,MP3声控录音机
  8. 数字臧品系统开发运行逻辑数字臧品系统开发源码搭建流程
  9. ADMM algorithm
  10. 让XP系统也支持微软雅黑字体
  11. 如何使用码云Gitee上传本地项目
  12. 浅谈LSTM对于周期时间序列数据的预测
  13. CSS 背景位置 background-position属性
  14. JavaCC详解 绝对干货
  15. 在工作中历练思考力,行动力,表达力
  16. 三星智能手表取得快速增长,华为和小米则以低价穿戴设备取胜
  17. < Linux > 守护进程
  18. 职场必看的十部经典电影
  19. Switch statement can be replaced with enhanced ‘switch‘
  20. linux内核入口函数start_kernal

热门文章

  1. U盘加密软件厂商提醒:实现U盘文件防拷贝、外发文件加密控制
  2. 第一次独立使用海洋静力触探仪器CPTU
  3. java云图_javaWeb知识点总结[云图智联]
  4. 在unity的C#中使用HDR的颜色
  5. 学习日记--web项目字体添加
  6. 2021年中国电子展将举行,TCL蓄势待发,邀您见证科技风暴
  7. C++面相对象学习总结
  8. ubuntu安装显卡和TensorFlow和PyTorch
  9. hpg9服务器系统安装2012,如何在HPdl380Gen9服务器上安装Redhat7.2并配置软RAID
  10. Beginning C++ Through Game Progamming 全书学习笔记