打印本文 打印本文  关闭窗口 关闭窗口  
VFP中用SPT访问SQLSERVER
作者:佚名  文章来源:不详  点击数  更新时间:2008/6/12 21:01:59  文章录入:杜斌  责任编辑:杜斌

  VFP因它简单易学,可快速建立应用软件而深受广大程序员喜爱,但其数据库系统不安全也是令广大用户非常头痛。随着MS SQL SERVER数据库系统的推广应用,其强大的安全性能普遍受到好评。笔者在长期的编程实践中发现利用VFP的SQL PASS-THROUGH(SPT) 技术结合MS SQL SERVER 数据库系统,也能象VB、DELPHI、POWERBUILDER一样轻松开发出优秀的客户/服务器(C/S)应用软件。现通过编写一个简单的通信录例子和广大VFP爱好者共同探讨。

  一、服务器端MS SQL SERVER数据库设计

  1、在MS SQL SERVER中建立名为“SFXT”的数据库。

  2、在SFXT数据库中建立名为“通信录”的表,结构如下:

  列名(字段名) 数据类型 长度

  姓名 CHAR 8

  生日 DATETIME 8

  电话 CHAR 11

  EMAIL CHAR 30

  并将姓名设置为主键

  3、在SFXT数据库中建立查询出所有记录的存储过程 SP_SEARCHALL

  CREATE PROCEDURE [SP_SEARCHALL] AS

  SELECT * FROM 通信录 ORDER BY 姓名

  RETURN

  4、在SFXT数据库中建立插入新记录的存储过程 SP_INSERTDATA

  CREATE PROCEDURE [SP_INSERTDATA]

  @NAME [CHAR] (10),

  @BIRTHDAY [DATETIME],

  @TELEPHONE [CHAR] (11),

  @EMAIL [CHAR] (30)

  AS

  INSERT INTO 通信录(姓名,生日,电话,EMAIL) valueS (@NAME,@BIRTHDAY,@TELEPHONE,@EMAIL)

  RETURN

  二、客户端VFP的SQL PASS-THROUGH技术设计

  1、建立VFP表单界面,按钮内容如下

  建立ODBC数据源

  建立连接方式1

  建立连接方式2

  活动连接属性设置

  执行存储过程查询数据

  执行SQL语句查询数据

  向存储过程传替参数插入新记录

  设置当前表的属性修改数据

  断开指向数据源的连接

  退出程序

  2、建立名为SFXT的ODBC数据源连接MS SQL SERVER中的SFXT数据库

  可通过执行上面VFP表单的按钮建立ODBC数据源来完成;或者通过运行WINDOWS控制面板中的ODBC数据源来 完成,主要设置包括选择SQL SERVER驱动程序,通信协议,登录标识与密码等。

  建立ODBC数据源按钮的CLICK事件:

  *函数说明SQLSTRINGCONNECT([CCONNECTSTRING])

  *省略连接字符串CCONNECTSTRING时显示SQL数据源对话框,可选择或新建数据源。

  SQLSTRINGCONNECT()

  3、两种连接MS SQL SERVER数据源的方式。

  使用现有数据源名称建立连接,建立连接方式1按钮CLICK事件:

  PUBLIC VODBC,VUSER,VPWD,VCONN

  VODBC='SFXT' &&连接SQL SERVER数据库ODBC数据源名称

  VUSER='SA' &&访问SQL SERVER数据库的登录用户名,SA为系统用户

  VPWD='5213' &&用户登录密码,为SA系统用户设置的密码

  VCONN=SQLCONNECT(VODBC,VUSER,VPWD)

  IF VCONN>0

  MESSAGEBOX('连接成功!',64,'ODBC数据源')

  ELSE

  MESSAGEBOX('连接失败!',64,'ODBC数据源')

  ENDIF

  使用连接字符串建立数据源连接,“建立连接方式2”按钮CLICK事件:

  PUBLIC VCONN

  VCONN=SQLSTRINGCONNECT('DSN=SFXT;UID=SA;PWD=5213')

  IF VCONN>0

  MESSAGEBOX('连接成功!',64,'ODBC数据源')

  ELSE

  MESSAGEBOX('连接失败!',64,'ODBC数据源')

  ENDIF

  4、数据源连接的主要参数设置,“活动连接属性设置”按钮CLICK事件:

  *注:用函数SQLGETPROP()可返回设置的参数

  SQLSETPROP(VCONN,"ASYNCHRONOUS",.F.) &&取假值时结果为同步返回,取真值时为异步返回

  SQLSETPROP(VCONN,"CONNECTTIMEOUT",15) &&连接超时等待秒数设置,可取值0至600

  SQLSETPROP(VCONN,"IDLETIMEOUT",0) &&空闲超 时间隔秒数,取0为无限期等待

  SQLSETPROP(VCONN,"TRANSACTIONS",1) &&取1时为自动处理远程事务,取2为手工处理

  5、执行存储过程查询数据按钮CLICK事件:

  *函数说明SQLEXEC(NCONNECTIONHANDLE,[CSQLCOMMAND,[CURSORNAME]])

  *NCONNECTIONHANDLE 当前数据源活动连接句柄

  *CSQLCOMMAND 执行SQL SERVER存储过程的SQL语句表达式

  *CURSORNAME 返回执行结果临时表的名称

  SQLEXEC(VCONN,"EXECUTE SP_SEARCHALL","我的通信录")

  BROWSE

  6、执行SQL语句查询数据按钮CLICK事件:

  *函数说明SQLEXEC(NCONNECTIONHANDLE,[CSQLCOMMAND,[CURSORNAME]])

  *NCONNECTIONHANDLE 当前数据源活动连接句柄

  *CSQLCOMMAND 执行SQL SERVER存储过程的SQL语句表达式

  *CURSORNAME 返回执行结果临时表的名称

  SQLEXEC(VCONN," SELECT * FROM 通信录 ","我的通信录")

  BROWSE

  7、向存储过程传替参数插入新记录按钮CLICK事件:

  LOCAL VNAME,VBIRTHDAY,VTELEPHONE,VEMAIL,VSQL

  *随机产生新记录举例

  VNAME='姓名'+SYS(3) &&姓名

  VBIRTHDAY=DTOC(DATE()-INT(RAND()*10000)) &&生日

  VTELEPHONE=SYS(3) &&电话

  VEMAIL=SYS(3)+'@HOTMAIL.COM' &&电子邮箱

  *将传递到存储过程的参数转换成字符串,并加引号形成SQL语句

  VSQL="EXECUTE SP_INSERTDATA "+"'"+VNAME+"','"+VBIRTHDAY+"','"+VTELEPHONE+"','"+VEMAIL+"'"

  IF SQLEXEC(VCONN,VSQL)>0

  MESSAGEBOX('插入记录成功!',64,'信息')

  ELSE

  MESSAGEBOX('插入记录失败!',64,'信息')

  ENDIF

  SQLEXEC (VCONN," EXECUTE SP_SEARCHALL ","我的通信录")

  BROWSE

  8、设置当前表的属性修改数据按钮CLICK事件:

  *注:用函数CURSORGETPROP()可返回设置的参数

  CURSORSETPROP('BATCHUPDATECOUNT',100) &&发送到缓冲表的远程数据源的更新指令的数目

  CURSORSETPROP('BUFFERING',3) &&设置当前表为开放式行缓冲

  CURSORSETPROP('FETCHSIZE',-1) &&从远程表中提取全部查询记录

  CURSORSETPROP('KEYFIELDLIST','姓名') &&指定远程表的主关键字段

  CURSORSETPROP('SENDUPDATES',.T.) &&当前缓冲表更改内容时发送SQL语句更新远程表

  CURSORSETPROP('TABLES','通信录') &&指定连接的远程表名

  *本地缓冲表与远程表字段对应关系

  CURSORSETPROP('UPDATENAMELIST','姓名 通信录.姓名,生日 通信录.生日,电话 通信录.电话,;

  EMAIL 通信录.EMAIL')

  *指定可更新字段列表

  CURSORSETPROP('UPDATABLEFIELDLIST','姓名',生日,电话,EMAIL')

  CURSORSETPROP('UPDATETYPE',1) &&远程表更新方式,替换方式

  CURSORSETPROP('WHERETYPE',3) &&更新SQL语句中WHERE子句包含主关键字与被修改过的字段

  BROWSE &&修改缓冲表数据,移动记录指针后,自动发送SQL语句更新远程库

  9、断开指向数据源的连接按钮CLICK事件:

  SQLDISCONNECT(VCONN)

  10、退出程序按钮CLICK事件:

  THISFORM.RELEASE

打印本文 打印本文  关闭窗口 关闭窗口