VFP与SQL远程异构数据库

数据|数据库

<P> </P>熟悉 VFP的朋友都知道,在 VFP 里我们可以使用远程视图 (Remote View) 和 SPT(SQL Pass Through) 技术控制远程异构数据库。这些技术其实是 VFP 对 ODBC 的 API 的封装,所以对于用户来说访问远程数据库就像操作传统的DBF一样简单。关于这两种技术的使用,完全可以洋洋洒洒地写下一本书,鉴于本文主题及篇幅,这里仅枚举 SPT 技术访问远程数据的应用。

  很多人认为有了远程视图这样直观、简单的工具,为什么还需要 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,希望有机会与大家一起讨论这方面的问题。

时间: 2025-01-01 21:25:43

VFP与SQL远程异构数据库的相关文章

利用MS SQL实现异构数据库的分布式查询的t-sql代码

分布式|数据|数据库         /*利用MS SQL实现异构数据库的分布式查询的t-sql代码*/ exec sp_addlinkedserver  'MS_SQL','','SQLOLEDB','172.18.9.20'exec sp_addlinkedsrvlogin 'MS_SQL','false',null,'Sa','capec' /*创建一个sqlserver对sqlserver的数据库远程链接*/ exec sp_addlinkedserver 'ora', 'Oracle'

用vfp与sql server构建Client/Server应用程序(远程视图)(1)

本文是<用 Visual FoxPro 与 SQL Server 构建 Client/Server 应用程序>系列的一部分,照例"远程视图"应不是开篇章节,但我们发现:在我们为网站准备的文章中有太多的理论性的东西,为了缓解这一矛盾,我们决定把"远程视图"提上来先写. 当下最流行的 ADO 脱胎于 Visual FoxPro,在实际使用中两者各有特色,所以不要小看 Visual FoxPro 在远程数据处理上的能力,它绝对强大!读者可以参看本站的<M

SQL链接服务器访问远程Access数据库

由于Access数据库是一种文件型数据库,所以无法跨服务器进行访问.下面我们来介绍一下如何利用SQL Server 的链接服务器,把地理上分散的Access 数据库整合起来,使 Access 数据库具有跨越 Web 服务器群的能力.此方法还可以使 Access 数据库与SQL Server数据库,甚至 Oracle 等网络数据库连接起来,实现异构数据库的互连,最终执行分布式的查询.更新.命令和事务. 1.创建链接服务器,连接本地 Access 数据库 创建链接服务器可以用"企业管理器"

sql plus 和 pl/sql无法连接远程oracle数据库

前言:安装完oracle客户端后,可能会出现sql plus 和 pl/sql无法连接远程oracle数据库的情况,可能是以下原因: 针对sql plus连接不上: 1 可能原因:之前安装过oracle数据库客户端并且没有卸载干净,sql plus使用了之前oracle客户端的配置,导致连接不上   解决办法:在系统变量中,将有关之前的oracle客户端信息删除,如路径信息   针对sql plus可以连接的情况下,针对pl/sql连接不上 1 可能原因:之前安装过oracle数据库客户端并且没

sql2005-高人救我,sql server 2005 数据库不时无法远程连接

问题描述 高人救我,sql server 2005 数据库不时无法远程连接 说明:关于我这个问题,我穷究了好几天,网上几乎所有相关问题的方法我都试过了,仍然没有解决.特来C论坛请教高手,万望各位不吝赐教.新来的,无C币,悬赏C币只有一个,仅代表我的一点感激之情,请勿见笑. 情况:asp + sql 2005,用的动易siteweaver 6.8 asp cms系统,一台web服务器,一台数据服务器,两台机器直连组的局域网. 问题:直接在数据服务器上连接数据库,一直都正常,在web服务器上通过内网

pl sql连不上数据库-pl sql远程连不上数据库

问题描述 pl sql远程连不上数据库 以前在家用pl sql可以连接数据库.自从公司改了用户之后,在公司可以连接数据库,但是在家连不上数据库了.但是别人在家都可以pl sql连接上数据库.哪位大神知道是怎么回事啊?在公司可以连接,只是在家连不上,所以可以排除不是连接配置的问题.

PL/SQL远程备份和恢复Oracle数据库_oracle

在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端.------------------------------------------  首先无论你的Oracle服务器是Linux还是windows操作系统,Oracle的备份和恢复操作都是使用DBMS_DUMP来实现导入(备份)和导出(恢复).首先你要安装好PL/SQL,用PL/SQL来执行我下面提供的JOB就可以实现了.  一.Oracle的导出(备份) 1.用PLSQL连接Oracle数据库服务器,使用你需要导出的用户连接

异构数据库之间的导入导出

数据|数据库 异构数据库之间的导入导出 //MSSQL2EXCELADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\mysmallexe\excel2sql\yp.xls;'+'Extended Properties=excel 8.0';ADOConnection1.Execute('select * into [Abc] from drug_yk IN [ODBC] [ODBC;

通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案_mssql2005

1.新建链接服务器  在图1中选中"链接服务器",右键选择"新建链接服务器",如图2,配置相关参数. 2.配置相关参数 在"常规"选项中,填写"链接服务器名称",访问接口选中 " Microsoft OLE DB Provider for Oracle"项.其中产品名称.数据源.访问接口字符串请填写配置的Oracle客户端在本地配置的net服务名.如图3所示. 在"安全性"项中,选中使用