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
|