VFP操作SQL数据库
发布时间:2008-04-01 16:51:33 来源: 作者: 点击:518现在用SPT方式比较灵活吧,不过我也才刚刚接触,看过些示例自己没真正去实践过一整套的完整操作。下面的一些说明和示例对初学SPT应该有点用的:
SPT 起跳
熟悉 Fox 的朋友都知道,在 VFP 里我们可以使用远程视图 (Remote View) 和 SPT(SQL Pass Through) 技术控制远程异构数据库。这些技术其实是 VFP 对 ODBC 的 API 的封装,所以对于用户来说访问远程数据库就像操作传统的DBF一样简单。关于这两种技术的使用,完全可以洋洋洒洒地写下一本书,鉴于本文主题及篇幅,这里仅枚举 SPT 技术访问远程数据的应用。
SPT与远程视图
很多人搞不懂有了远程视图这样直观、简单的工具,为什么还需要 SPT 呢?确实 SPT 较远程视图难以掌握,但细细体会你会发现:远程视图其实是对 SPT 的可视化工具!SPT 较远程视图更具威力,远程视图提供的功能只是 SPT 的一个子集。仔细探索两者优劣,我们发现:
SPT 的优势:
1. 一次得到多个Cursor
2. 执行除 Select 以外的其他 SQL 语句,如 Insert、Update、Delete等
3. 执行远程数据库的存储过程
4. 执行远程数据库的特殊函数、命令
5. 事务管理
SPT 的劣势:
1. 没有图形用户界面
2. 必须人工维护连接
3. 得到的Cursor默认是"可读写"Cursor,要使它成为"可更新"Cursor必须经过设定
下面就顺着我们对 SPT 的认识,来浏览一下这种伟大的工具吧!(注意:本文所有例程均使用 SQL Server的NorthWind 数据库演示)
管理连接:
建立连接:
(注意:本文所有示例代码若用到连接的,默认采用"建立连接"代码中产生的连接句柄"con")
WAIT ’ 连接到 SQL Server 上去 ’ NOWAIT NOCLEAR WINDOW
SQLSETPROP(0,"DispLogin" ,3) &;&;设置环境为:"从不显示 ODBC
登陆对话框"
con=SQLSTRINGCONNECT("driver=SQLServer; Server=BOE; Uid=sa; pwd=; database=northwind")
*假定 SQL Server 服务器名为 BOE, 用户 ID 是sa, 口令是空串
*如果你的 SQL Server 的服务器名, 用户 ID, 口令与上不同,请修改以上代码中的相关部分以符合你
系统中的设置
WAIT clear
IF con<=0
MESSAGEBOX(’ 连接失败 ’,64,’ 连接到 SQL Server 上去 ’)
ELSE
MESSAGEBOX(’ 连接成功 ’,64,’ 连接到 SQL Server 上去 ’)
ENDIF
断开连接:
SQLDISCONNECT(con)
一次得到多个Cursor
我们可以用一次 SPT 传回多个Cursor,如下:
cSQL="SELECT * FROM EMPLOYEES"+CHR(10)+"SELECT * FROM CUSTOMERS"+CHR(10)+"SE
LECT * FROM PRODUCTS"
SQLEXEC(con,cSQL,"TEMP")
SQLEXEC( ) 的返回值表示Cursor的数量,这里返回 3 。这三个Cursor分别以: TEMP,TEMP1,TEMP2 命名。
执行除 SQL-Select 以外的 SQL 语句
cSQL="IF EXISTS(SELECT * FROM CUSTOMERS WHERE CUSTOMERID=’TEST’)"
cSQL=cSQL+" DELETE FROM CUSTOMERS WHERE CUSTOMERID=’TEST’"
cSQL=cSQL+" ELSE INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES(’TEST’,’ 这是一个测试! ’)"
IF SQLEXEC(CON,cSQL)<=0
MESSAGEBOX(’ 执行失败 ’,64,’ 发送语句到 SQL Server 上去 ’)
ELSE
MESSAGEBOX(’ 执行成功 ’,64,’ 发送语句到 SQL Server 上去 ’)
ENDIF
行文至此,也许有朋友会问:如果 SQL 语句中 CUSTOMERID 是一个变量怎么办呢?有两个
常用的解决
方案:
拼接字符串
CUSTID=’TEST’
cSQL="IF EXISTS(SELECT * FROM CUSTOMERS WHERE CUSTOMERID=’"+CUSTID+"’)"
cSQL=cSQL+" DELETE FROM CUSTOMERS WHERE CUSTOMERID=’"+CUSTID+"’"
cSQL=cSQL+" ELSE INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES(’"+CUSTID+"’,’ 这是一个测试! ’)"
SQLEXEC(CON,cSQL)
SPT 标准变量传递法
CUSTID=’TEST’
cSQL="IF EXISTS(SELECT * FROM CUSTOMERS WHERE CUSTOMERID=?CUSTID)"
cSQL=cSQL+" DELETE FROM CUSTOMERS WHERE CUSTOMERID=?CUSTI