VFP与SQL远程异构数据库
来源: 作者: 出处:综艺读书 2006-10-13
文/陈纯
|
|
|||
很多人认为有了远程视图这样直观、简单的工具,为什么还需要 SPT 呢?确实 SPT 较远程视图难以掌握,但细细体会你会发现:远程视图其实是对 SPT 的可视化工具!SPT 较远程视图更具威力,远程视图提供的功能只是 SPT 的一个子集。其优势和劣势主要体现在以下几个方面:
l、SPT 的优势
1) 一次得到多个Cursor;
2) 执行除 Select 以外的其他 SQL 语句,如 Insert、Update、Delete等;
3) 执行远程数据库的存储过程 ;
4) 执行远程数据库的特殊函数、命令等 ;
5) 事务管理 。
2、SPT 的劣势
1) 没有图形用户界面;
2) 必须人工维护连接;
3) 得到的Cursor默认是“可读写”Cursor,要使它成为“可更新”Cursor必须经过设置才行。
下面就顺着我们对 SPT 的认识,来浏览一下这个伟大的工具吧!(注意:本文所有例程均使用 SQL Server的NorthWind 数据库演示)。
管理连接
l、建立连接
注意:本文所有示例的代码若用到连接的,默认采用“建立连接”代码中产生的连接句柄 “CON”。
WAIT ' 连接到 SQL Server 上去 ' NOWAIT NOCLEAR WINDOW
SQLSETPROP(0,"DispLogin" ,3) &&&& 设置环境为“从不显示 ODBC 登录对话框”。
CON=SQLSTRINGCONNECT("driver=SQL Server;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
2、断开连接
SQLDISCONNECT(CON)
一次得到多个Cursor
我们可以用一次 SPT 传回多个Cursor,如下:
cSQL="SELECT * FROM EMPLOYEES"+CHR(10)+"SELECT * FROM CUSTOMERS"+CHR(10)+"SELECT * FROM PRODUCTS"
?SQLEXEC(con,cSQL,"TEMP")
SQLEXEC( ) 的返回值表示Cursor的数量,这里返回 3 。这三个Cursor分别以 TEMP、TEMP1和TEMP2 命名。
执行其他 SQL 语句
下面我们尝试执行SQL Server以外的SQL语句:
cSQL="IF EXISTS(SELECT * FROM CUSTOMERSswheres CUSTOMERID='TEST')"
cSQL=cSQL+" DELETE FROM CUSTOMERSswheres 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 是一个变量怎么办呢?其实 我们可以通过两个常用的解决方案来解决:
1、拼接字符串
CUSTID='TEST'
cSQL="IF EXISTS(SELECT * FROM CUSTOMERSswheres CUSTOMERID='"+CUSTID+"')"
cSQL=cSQL+" DELETE FROM CUSTOMERS swheresCUSTOMERID='"+CUSTID+"'"
cSQL=cSQL+" ELSE INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES('"+CUSTID+"',' 这是一个测试! ')"
?SQLEXEC(CON,cSQL)
2、SPT 标准变量传递法
CUSTID='TEST'
cSQL="IF EXISTS(SELECT * FROM CUSTOMERSswheresCUSTOMERID=?CUSTID)"
cSQL=cSQL+" DELETE FROM CUSTOMERSswheresCUSTOMERID=?CUSTID"
cSQL=cSQL+" ELSE INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES(?CUSTID,' 这是一个测试! ')"
?SQLEXEC(CON,cSQL)
特殊函数和命令
如果在 SQL Server 中你有足够的权限,通过 SPT 使用远程数据库的特殊函数和命令,你可以完全控制 SQL Server ,这里我们就演示“怎样取得数据库服务器的时间”:
?SQLEXEC(con,"select getdate() as serverdatetime","temp1")
?temp1.serverdatetime
USE IN ("temp1")
事务管理
在一些复杂的应用中,往往会有一项操作影响几个表的情况。就客户端来说,发送到远程数据库的数据变动可能来源很多:表缓冲的多行记录的变动,行缓冲的单行记录变化,以及前文我们演示的直接用 SQL 语句传递的数据维护,林林总总……怎样把这些更新行为控制在一个事务中呢!要么一起成功,要么一起回滚。
cSQL="DELETE FROM CUSTOMERSswheresCUSTOMERID='BLAUS'"+CHR(10)
cSQL=cSQL+"INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES('TEST1',' 这是一个测试! ')"
SQLSETPROP(CON,"Transactions" ,2)&&&& 开始一个事务
IRETURN=SQLEXEC(CON,cSQL)
IF IRETURN=1
SQLCOMMIT(CON)&&&& 事务交付
ELSE
SQLROLLBACK(CON)&&&& 事务回滚
ENDIF
SQLSETPROP(CON,"Transactions" ,1)&&&& 重新回到自动事务处理状态
&&&&就本例而言,“DELETE FROM CUSTOMERSswheres CUSTOMERID='BLAUS'”总是不能执行的,SQL Server会返回出错揭示:
&&&&DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_Orders_Customers'.
&&&&The conflict occurred in database 'Northwind', table 'Orders', column 'CustomerID'.
&&&&所以这笔事务总是被回滚的!!
从例程中可以看到,我们开启的事务其实是针对“连接”的,也就是说通过该“连接”的所有数据更新都包含于事务中,直到事务被回滚或交付。
SQLSETPROP(CON,"Transactions" ,2 ), 其实是开启了人工事务处理,也就是说必须由用户明确地给出交付或者回滚指令,事务才会结束。所以笔者以为:完成一笔事务以后,应执行 SQLSETPROP(CON,"Transactions" ,1 ) 将“连接”的事务模式设为默认的“自动”,这样可以防止用户陷入未知的事务中去。
SPT的基本操作还不止这些,以后我们还会为读者朋友介绍其他一些基本操作。如果朋友们能掌握这些基本操作,就能编写不错的 C/S 程序了。虽然本文是用 SQL Server 作为远程数据库,但是如果你使用 DB2和Oracle等,在 VFP 中也可以进行同样的处理。
本文开始已提到 VFP 在这方面的内容很广泛,寥寥千言当然不能尽言,有兴趣的朋友可以去访问www.boeworks.com,以便查阅更多的内容。OK,希望有机会与大家一起讨论这方面的问题。
相关图文阅读
频道图文推荐
相关专题
·数据库专栏 (4469篇文章)
·数据库处理专题 (7214篇文章)
·城域网专题 (6668篇文章)
·数据库安全技术专题 (11215篇文章)
·数据库安装与卸载 (8929篇文章)
·Linux数据库宝典 (11165篇文章)
·数据库相关文章 (4470篇文章)
·数据库处理专题 (7214篇文章)
·城域网专题 (6668篇文章)
·数据库安全技术专题 (11215篇文章)
·数据库安装与卸载 (8929篇文章)
·Linux数据库宝典 (11165篇文章)
·数据库相关文章 (4470篇文章)
最新技术文档
·用FoxWeb在网上快速发布你的FOXPRO数据库 11-03
·用Foxpro制作Windows输入法码表 11-03
·用FoxPro生成HTML文件 11-03
·下载和上载远程视图数据 10-30
·为Visual FoxPro应用程序增加文件压缩功能 10-30
·为VFP添加循环微调控件类 10-30
·为FoxPro中的弹出式菜单增加自学习功能 10-30
·通过编程运行拨号网络连接 10-29
·谈谈在基于Foxpro的MIS中实现提示、帮助与询问 10-29
·谈谈VFP和SQL SERVER搭配做C/S系统 10-29
·用Foxpro制作Windows输入法码表 11-03
·用FoxPro生成HTML文件 11-03
·下载和上载远程视图数据 10-30
·为Visual FoxPro应用程序增加文件压缩功能 10-30
·为VFP添加循环微调控件类 10-30
·为FoxPro中的弹出式菜单增加自学习功能 10-30
·通过编程运行拨号网络连接 10-29
·谈谈在基于Foxpro的MIS中实现提示、帮助与询问 10-29
·谈谈VFP和SQL SERVER搭配做C/S系统 10-29
站内各频道最新更新文档
站内最新制作专题
|
|||
| ·ACDSEE专题教程-下载使用 ·迅雷专题教程-下载使用 ·Windows XP频道 ·Windows Vista频道 ·Windows 2000频道 ·win2003频道 ·Freebsd频道 ·Oracle频道 |
·Linux频道 ·Windows频道 ·邮件服务器专题 ·协议大全 ·数据恢复指南教程 ·FreeBSD使用教程 ·Linux数据库宝典 ·Linux基础知识 |
||
热门关键字导读
站内频道文章精选
| · 秘密:Vista隐蔽的动态屏保 · 腾讯开发新电子宠物--QQ熊 · 惠普否认2999元PC有价无货 |
· 驱逐Win系统“流氓”文件 · WinXP中获取未使用的IP地址 · 尝试format C:格式化硬盘? |
| · 在DOS下恢复回收站中的文件 · 拯救WinXP崩溃的救命稻草 · Linux系统中超级权限的应用 |
· 搜狗PK谷歌:谁能代言拼... · 昨日重现,一键GHOST轻松.. · 实现Web迅雷在空闲时杀毒 |
| · AVIFile函数制做AVI文件 · VC中链接动态链接库的方法 · 熊猫烧香核心源码(Delphi) |
· DateDiff函数祥解 · JavaScript去除空格的三种 · js效果 图片加载进度实时.. |
| · SQL Server数据库优化方案 · Oracle的初学者入门心得 · JSP连接Mysql数据库 |
· Photoshop为美女做艺术处理 · 用Freehand创建发光字特效 · 设计自己的个性QQ动态表情 |
百度推荐,商机无限
搜索您感兴趣的内容




