VFP是什么?

如题所述

第1个回答  2013-12-07
Visual FoxPro ,是Microsoft公司从Fox公司的FoxBase数据库软件经过数次改良,并且移植到Windows之后,得来的应用程序开发软件,主要用于开发数据管理与运算等方面的软件。
  FoxBase采用命令行方式(为了和当时流行的数据库软件dBase兼容……)但是速度比当时其他的数据库软件要快。
  VFP是Microsoft公司推出的最新可视化数据库管理系统平台,是功能特别强大的32位数据库管理系统。它提供了功能完备的工具、极其友好的用户界面、简单的数据存取方式、独一无二的跨平台技术,交肯有良好的兼容性、真正的可编译性和较强的安全性,是目前最快捷、最实用的数据库管理系统软件之一。
  Visual FoxPro成长之路
  Visual FoxPro(以下简称VFP)是个不断成长的小伙,承蒙Visual Studio(以下简称VS)的关照,VFP在开发者心目中一直是和VB、VC地位相同的工具语言,只不过它并不是通用开发工具,而只是专注于数据库应用的开发。
  然而,吊足大家胃口的VS.NET终于出现在开发者面前时,竟不见了VFP的身影,着实引起开发社区的一阵骚动。微软不要VFP了?不是,恰恰相反,VFP忍受不了VS缓慢的升级速度,“单干”了。现在的VFP已经升级到版本9,并且完全支持.NET技术。
  以下让我们来一起关注一下VFP的成长之路,看看每次升级VFP都为我们带来了那些诱人的新特性。当然,我们只整理了VFP 6.0以后的版本,也就是VFP 7、8、9。这些内容来自MSDN Library Online,我们仅参考每个版本VFP产品文档中的“What’s New”部分进行整理。
  VFP 7
  Web Services支持 VFP 7支持注册和发布Web Services,而无需使用Microsoft SOAP Toolkit和VFP扩展来从底层完成这些任务;
  服务器增强 VFP 7对于COM服务器作了很大程度的增强,可以与核心平台如COM+服务进行互操作;
  XML支持 为了适应以XML形式在Web上传送数据的潮流,VFP 7提供了一些函数用于在XML数据和FoxPro游标(Cursor)或表格(Table)之间的转换。
  多样的XBase特性 VFP添加了很多新的或改进的XBase特性,并且这些特性都是用VFP语言编写的;
  OLE DB Provider 通过实现OLE DB Provider接口,开发者可以在任何支持OLE DB的程序和语言中调用VFP数据。
  VFP 8
  n 数据特性增强 VFP 8对其数据特性进行了改进,并增加了很多新的数据特性,包括:远程数据连接、创建DataEnvironment类、自动增长域值、支持对照序列、与SQL语句Select…Union之间的隐式数据转换、使用SQL Select命令插入行等;
  其他增强 VFP 8对一些工具、示例数据库和解决方案案例都进行了改进。
  VFP 9
  数据和XML增强 这一时期的VFP对其数据特性进行了巨大的加强,改进项目之多真是令人眼花缭乱,详情可以参考这里,此处不再赘述;
  实现SQL语言 VFP 9已经能够充分地支持SQL查询语言;
  设计器的增强 VFP 9增强了这些设计器:报表和标签设计器、菜单设计器、表格设计器、查询和视图设计器、数据环境设计器以及类和窗体设计器等;
  其他方面的增强 和VFP 8一样,VFP 9在其他微小的细节上进行了不少的改进,使得开发者的体验更加舒适。
  当然,上面提到的只是每次版本更新时所带来的新特性的冰山一角,另外没有提到的是IDE(在VFP里是Interactive Development Environment)和语言的增强,这是每次版本更新都会有所改进而且是大幅改进的,相信个中感受只有铁杆Foxer能够体会得到了。尽管这里所列的改进看上去甚少,但在MSDN Library Online上却占去了巨大的篇幅,有兴趣的朋友不妨到MSDN上浏览一下,就能深刻体会到为什么VFP不会死,而且还能茁壮成长了。
  vfp正确使用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 ?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[1]
第2个回答  2013-12-07
微软推出的新的桌面应用程序是WinFrom的升级版..唯一与WinFrom不同的是..VPF是以XML格式存储的后置代码