[backcolor=rgb(255,255,255)]VFP因它简单易学,可快速建立应用软件而深受广大程序员喜爱,但其数据库系统不安全也是令广大用户非常头痛。随着MS SQL SERVER数据库系统的推广应用,其强大的安全性能普遍受到好评。笔者在长期的编程实践中发现利用VFP的SQL PASS-THROUGH(SPT) 技术结合MS SQL SERVER 数据库系统,也能象VB、DELPHI、POWERBUILDER一样轻松开发出优秀的客户/服务器(C/S)应用软件。现通过编写一个简单的通信录例子和广大VFP爱好者共同探讨。 [/backcolor]
[backcolor=rgb(255,255,255)]一、服务器端MS SQL SERVER数据库设计 [/backcolor]
[backcolor=rgb(255,255,255)]1、在MS SQL SERVER中建立名为“SFXT”的数据库。 [/backcolor]
[backcolor=rgb(255,255,255)]2、在SFXT数据库中建立名为“通信录”的表,结构如下: [/backcolor]
[backcolor=rgb(255,255,255)]列名(字段名) 数据类型 长度 [/backcolor]
[backcolor=rgb(255,255,255)]姓名 CHAR 8 [/backcolor]
[backcolor=rgb(255,255,255)]生日 DATETIME 8 [/backcolor]
[backcolor=rgb(255,255,255)]电话 CHAR 11 [/backcolor]
[backcolor=rgb(255,255,255)]EMAIL CHAR 30 [/backcolor]
[backcolor=rgb(255,255,255)]并将姓名设置为主键 [/backcolor]
[backcolor=rgb(255,255,255)]3、在SFXT数据库中建立查询出所有记录的存储过程 SP_SEARCHALL [/backcolor]
[backcolor=rgb(255,255,255)]CREATE PROCEDURE [SP_SEARCHALL] AS [/backcolor]
[backcolor=rgb(255,255,255)]SELECT * FROM 通信录 ORDER BY 姓名 [/backcolor]
[backcolor=rgb(255,255,255)]RETURN [/backcolor]
[backcolor=rgb(255,255,255)]4、在SFXT数据库中建立插入新记录的存储过程 SP_INSERTDATA [/backcolor]
[backcolor=rgb(255,255,255)]CREATE PROCEDURE [SP_INSERTDATA] [/backcolor]
[backcolor=rgb(255,255,255)]@NAME [CHAR] (10), [/backcolor]
[backcolor=rgb(255,255,255)]@BIRTHDAY [DATETIME], [/backcolor]
[backcolor=rgb(255,255,255)]@TELEPHONE [CHAR] (11), [/backcolor]
[backcolor=rgb(255,255,255)]@EMAIL [CHAR] (30) [/backcolor]
[backcolor=rgb(255,255,255)]AS [/backcolor]
[backcolor=rgb(255,255,255)]INSERT INTO 通信录(姓名,生日,电话,EMAIL) valueS (@NAME,@BIRTHDAY,@TELEPHONE,@EMAIL) [/backcolor]
[backcolor=rgb(255,255,255)]RETURN [/backcolor]
[backcolor=rgb(255,255,255)]二、客户端VFP的SQL PASS-THROUGH技术设计 [/backcolor]
[backcolor=rgb(255,255,255)]1、建立VFP表单界面,按钮内容如下 [/backcolor]
[backcolor=rgb(255,255,255)]建立ODBC数据源 [/backcolor]
[backcolor=rgb(255,255,255)]建立连接方式1 [/backcolor]
[backcolor=rgb(255,255,255)]建立连接方式2 [/backcolor]
[backcolor=rgb(255,255,255)]活动连接属性设置 [/backcolor]
[backcolor=rgb(255,255,255)]执行存储过程查询数据 [/backcolor]
[backcolor=rgb(255,255,255)]执行SQL语句查询数据 [/backcolor]
[backcolor=rgb(255,255,255)]向存储过程传替参数插入新记录 [/backcolor]
[backcolor=rgb(255,255,255)]设置当前表的属性修改数据 [/backcolor]
[backcolor=rgb(255,255,255)]断开指向数据源的连接 [/backcolor]
[backcolor=rgb(255,255,255)]退出程序 [/backcolor]
[backcolor=rgb(255,255,255)]2、建立名为SFXT的ODBC数据源连接MS SQL SERVER中的SFXT数据库 [/backcolor]
[backcolor=rgb(255,255,255)]可通过执行上面VFP表单的按钮建立ODBC数据源来完成;或者通过运行WINDOWS控制面板中的ODBC数据源来 完成,主要设置包括选择SQL SERVER驱动程序,通信协议,登录标识与密码等。 [/backcolor]
[backcolor=rgb(255,255,255)]建立ODBC数据源按钮的CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]*函数说明SQLSTRINGCONNECT([CCONNECTSTRING]) [/backcolor]
[backcolor=rgb(255,255,255)]*省略连接字符串CCONNECTSTRING时显示SQL数据源对话框,可选择或新建数据源。 [/backcolor]
[backcolor=rgb(255,255,255)]SQLSTRINGCONNECT() [/backcolor]
[backcolor=rgb(255,255,255)]3、两种连接MS SQL SERVER数据源的方式。 [/backcolor]
[backcolor=rgb(255,255,255)]使用现有数据源名称建立连接,建立连接方式1按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]PUBLIC VODBC,VUSER,VPWD,VCONN [/backcolor]
[backcolor=rgb(255,255,255)]VODBC='SFXT' &&连接SQL SERVER数据库ODBC数据源名称 [/backcolor]
[backcolor=rgb(255,255,255)]VUSER='SA' &&访问SQL SERVER数据库的登录用户名,SA为系统用户 [/backcolor]
[backcolor=rgb(255,255,255)]VPWD='5213' &&用户登录密码,为SA系统用户设置的密码 [/backcolor]
[backcolor=rgb(255,255,255)]VCONN=SQLCONNECT(VODBC,VUSER,VPWD) [/backcolor]
[backcolor=rgb(255,255,255)]IF VCONN>0 [/backcolor]
[backcolor=rgb(255,255,255)]MESSAGEBOX('连接成功!',64,'ODBC数据源') [/backcolor]
[backcolor=rgb(255,255,255)]ELSE [/backcolor]
[backcolor=rgb(255,255,255)]MESSAGEBOX('连接失败!',64,'ODBC数据源') [/backcolor]
[backcolor=rgb(255,255,255)]ENDIF [/backcolor]
[backcolor=rgb(255,255,255)]使用连接字符串建立数据源连接,“建立连接方式2”按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]PUBLIC VCONN [/backcolor]
[backcolor=rgb(255,255,255)]VCONN=SQLSTRINGCONNECT('DSN=SFXT;UID=SA;PWD=5213') [/backcolor]
[backcolor=rgb(255,255,255)]IF VCONN>0 [/backcolor]
[backcolor=rgb(255,255,255)]MESSAGEBOX('连接成功!',64,'ODBC数据源') [/backcolor]
[backcolor=rgb(255,255,255)]ELSE [/backcolor]
[backcolor=rgb(255,255,255)]MESSAGEBOX('连接失败!',64,'ODBC数据源') [/backcolor]
[backcolor=rgb(255,255,255)]ENDIF [/backcolor]
[backcolor=rgb(255,255,255)]4、数据源连接的主要参数设置,“活动连接属性设置”按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]*注:用函数SQLGETPROP()可返回设置的参数 [/backcolor]
[backcolor=rgb(255,255,255)]SQLSETPROP(VCONN,"ASYNCHRONOUS",.F.) &&取假值时结果为同步返回,取真值时为异步返回 [/backcolor]
[backcolor=rgb(255,255,255)]SQLSETPROP(VCONN,"CONNECTTIMEOUT",15) &&连接超时等待秒数设置,可取值0至600 [/backcolor]
[backcolor=rgb(255,255,255)]SQLSETPROP(VCONN,"IDLETIMEOUT",0) &&空闲超 时间隔秒数,取0为无限期等待 [/backcolor]
[backcolor=rgb(255,255,255)]SQLSETPROP(VCONN,"TRANSACTIONS",1) &&取1时为自动处理远程事务,取2为手工处理 [/backcolor]
[backcolor=rgb(255,255,255)]5、执行存储过程查询数据按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]*函数说明SQLEXEC(NCONNECTIONHANDLE,[CSQLCOMMAND,[CURSORNAME]]) [/backcolor]
[backcolor=rgb(255,255,255)]*NCONNECTIONHANDLE 当前数据源活动连接句柄 [/backcolor]
[backcolor=rgb(255,255,255)]*CSQLCOMMAND 执行SQL SERVER存储过程的SQL语句表达式 [/backcolor]
[backcolor=rgb(255,255,255)]*CURSORNAME 返回执行结果临时表的名称 [/backcolor]
[backcolor=rgb(255,255,255)]SQLEXEC(VCONN,"EXECUTE SP_SEARCHALL","我的通信录") [/backcolor]
[backcolor=rgb(255,255,255)]BROWSE [/backcolor]
[backcolor=rgb(255,255,255)]6、执行SQL语句查询数据按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]*函数说明SQLEXEC(NCONNECTIONHANDLE,[CSQLCOMMAND,[CURSORNAME]]) [/backcolor]
[backcolor=rgb(255,255,255)]*NCONNECTIONHANDLE 当前数据源活动连接句柄 [/backcolor]
[backcolor=rgb(255,255,255)]*CSQLCOMMAND 执行SQL SERVER存储过程的SQL语句表达式 [/backcolor]
[backcolor=rgb(255,255,255)]*CURSORNAME 返回执行结果临时表的名称 [/backcolor]
[backcolor=rgb(255,255,255)]SQLEXEC(VCONN," SELECT * FROM 通信录 ","我的通信录") [/backcolor]
[backcolor=rgb(255,255,255)]BROWSE [/backcolor]
[backcolor=rgb(255,255,255)]7、向存储过程传替参数插入新记录按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]LOCAL VNAME,VBIRTHDAY,VTELEPHONE,VEMAIL,VSQL [/backcolor]
[backcolor=rgb(255,255,255)]*随机产生新记录举例 [/backcolor]
[backcolor=rgb(255,255,255)]VNAME='姓名'+SYS(3) &&姓名 [/backcolor]
[backcolor=rgb(255,255,255)]VBIRTHDAY=DTOC(DATE()-INT(RAND()*10000)) &&生日 [/backcolor]
[backcolor=rgb(255,255,255)]VTELEPHONE=SYS(3) &&电话 [/backcolor]
[backcolor=rgb(255,255,255)]VEMAIL=SYS(3)+'@HOTMAIL.COM' &&电子邮箱 [/backcolor]
[backcolor=rgb(255,255,255)]*将传递到存储过程的参数转换成字符串,并加引号形成SQL语句 [/backcolor]
[backcolor=rgb(255,255,255)]VSQL="EXECUTE SP_INSERTDATA "+"'"+VNAME+"','"+VBIRTHDAY+"','"+VTELEPHONE+"','"+VEMAIL+"'" [/backcolor]
[backcolor=rgb(255,255,255)]IF SQLEXEC(VCONN,VSQL)>0 [/backcolor]
[backcolor=rgb(255,255,255)]MESSAGEBOX('插入记录成功!',64,'信息') [/backcolor]
[backcolor=rgb(255,255,255)]ELSE [/backcolor]
[backcolor=rgb(255,255,255)]MESSAGEBOX('插入记录失败!',64,'信息') [/backcolor]
[backcolor=rgb(255,255,255)]ENDIF [/backcolor]
[backcolor=rgb(255,255,255)]SQLEXEC (VCONN," EXECUTE SP_SEARCHALL ","我的通信录") [/backcolor]
[backcolor=rgb(255,255,255)]BROWSE [/backcolor]
[backcolor=rgb(255,255,255)]8、设置当前表的属性修改数据按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]*注:用函数CURSORGETPROP()可返回设置的参数 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('BATCHUPDATECOUNT',100) &&发送到缓冲表的远程数据源的更新指令的数目 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('BUFFERING',3) &&设置当前表为开放式行缓冲 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('FETCHSIZE',-1) &&从远程表中提取全部查询记录 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('KEYFIELDLIST','姓名') &&指定远程表的主关键字段 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('SENDUPDATES',.T.) &&当前缓冲表更改内容时发送SQL语句更新远程表 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('TABLES','通信录') &&指定连接的远程表名 [/backcolor]
[backcolor=rgb(255,255,255)]*本地缓冲表与远程表字段对应关系 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('UPDATENAMELIST','姓名 通信录.姓名,生日 通信录.生日,电话 通信录.电话,; [/backcolor]
[backcolor=rgb(255,255,255)]EMAIL 通信录.EMAIL') [/backcolor]
[backcolor=rgb(255,255,255)]*指定可更新字段列表 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('UPDATABLEFIELDLIST','姓名',生日,电话,EMAIL') [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('UPDATETYPE',1) &&远程表更新方式,替换方式 [/backcolor]
[backcolor=rgb(255,255,255)]CURSORSETPROP('WHERETYPE',3) &&更新SQL语句中WHERE子句包含主关键字与被修改过的字段 [/backcolor]
[backcolor=rgb(255,255,255)]BROWSE &&修改缓冲表数据,移动记录指针后,自动发送SQL语句更新远程库 [/backcolor]
[backcolor=rgb(255,255,255)]9、断开指向数据源的连接按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]SQLDISCONNECT(VCONN) [/backcolor]
[backcolor=rgb(255,255,255)]10、退出程序按钮CLICK事件: [/backcolor]
[backcolor=rgb(255,255,255)]THISFORM.RELEASE[/backcolor]