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

通过工具建立连接

以上我们都是通过命令的方式建立连接,现在我们将使用Visual FoxPro提供的连接设计器建立连接。上文我们讲到:连接对象分为两类:“基于 DSN 的连接对象”和“基于字符串的连接对象”。图5:

  1. 在连接设计器中选择“数据源、用户标识、密码”就说明在建立“基于 DSN 的连接对象”,在“数据源”列表框中可选择当前可用的用户型、系统型 DSN。
  2. 在连接设计器中选择“连接串”就说明在建立“基于字符串的连接对象”,为了快速、正确的设计连接字符串,我们可以打开文件型 DSN 参考,注意:“基于字符串的连接对象”不依赖文件型 DSN。


图 5. 连接设计器

连接属性的设定

从连接设计器的画面上我们可以发现很多连接属性,他们代表什么意思呢?在讲述这些问题之前,我想告诉大家:所有这些属性的设定都可以通过DBSETPROP()函数,所有这些属性值的获取都可以通过DBGETPROP()函数得到。下面,我们简要介绍几个属性:

  1. 异步执行。默认值为 .F.。同步执行是指:通过连接传送到后端的命令会被一句一句地执行,前一句没有执行完毕后一句就不会被执行;而同步执行是指:当通过连接发出命令后,不管后端是否完成并返回结果,客户端程序可以继续往下走。
  2. 超时间隔-空闲(分)。默认值是 0。设定一个非 0 值时,一个连接如果在这段时间内没被使用,Visual FoxPro 将使它休眠,再次使用该连接时 Visual FoxPro会激活它。注意使用该属性,因为它常常使您的应用程序产生不明不白的错误,如"Connectivity error: unable to retrieve specific error information. Driver is probably out of resources."实际上现在 ODBC 提供了 POOL 的功能,这些问题可由 ODBC 自行解决,我们不用操心。
  3. 超时间隔-连接(秒)。默认值是 0。设定一个非 0 值时,指在这个时间段内Visual FoxPro将试图连接到服务器,如果不成功,Visual FoxPro将产生一个错误。
  4. 显示 ODBC 登录提示。在应用程序中,我们总不希望有系统弹出登录窗口,这样于形象不利、于程序的安全性不利,特别是设计 COM 对象时,由于无人看护,更不希望登录窗口的弹出,Visual FoxPro 为我们提供了三种选择,笔者经常使用“从不显示”。
  5. 显示错误信息。如果设定为 .t.,任何 ODBC 错误将以 Messagebox 窗口显示出来;反之,ODBC 错误有用户自行处理。显然我们基本上使用默认设置 .f.。

提示:在Visual FoxPro中很多关于数据处理方面的设定,(如:set delete)都是限于数据工作期的,而连接被激活后可以在多个数据工作期内公用。

远程视图

弱水三千,取一瓢饮——条件视图

在前文我们已经建立了两个远程视图,您也许发现这种整个把远程表读取过来的做法执行效果很好,其实不然。我有两大理由:

  1. 设想如果后端表很大(Customers 只有 91 条记录),有几万、几十万条记录,结果会这样?
  2. 设想如果网络用户很多,网路很繁忙,结果会怎样?

Client\Server设计的一个重要的课题就是使网络流量最小化,所以在设计远程视图时就要考虑这一解决问题。我们的想法是使远程视图仅下载有必要的信息,这就叫:弱水三千,取一瓢饮。例如:

CREATE SQL VIEW VCustomers
REMOTE CONNECTION Northwind SHARE ;
AS SELECT * FROM Customers
WHERE customerid LIKE 'ALFKI'

我们在 WHERE子句中加入条件“customerid LIKE 'ALFKI'”,现在我们发现只有一条记录从远端被下载。您也与已经发现这中间的不足:这个远程视图太死板了——只能为 Customerid 类似于'ALFKI'的记录提供服务,是不是可以把 'ALFKI'作为一个参数,供使这个远程视图更灵活,服务面更广。

可以,Visual FoxPro支持这样的远程视图:

CREATE SQL VIEW VCustomers ;
REMOTE CONNECTION Northwind SHARE ;
AS SELECT * FROM Customers ;
WHERE customerid LIKE cCustomerID

如果您打开远程视图或对已打开的远程视图执行REQUERY()、REFRESH()函数,Visual FoxPro会查找是由存在名为cCustomerID的变量。如果存在,Visual FoxPro 自动把变量值填入远程视图的SQL语句中;如果变量不存在,Visual FoxPro将弹出如下窗口询问变量值。

在实际开发应用程序中,我们会经常实现设定远程视图参数,在需要其它信息时,改变参数值,再用REQUERY()函数刷新客户端的数据;远程视图参数不仅可以填入普通数据,还可以使用统配符,如下:

cCustomerID='ALFKI'
USE Vcustomers
BROWSE
cCustomerID='%B%'
REQUERY('Vcustomers')
BROWSE

这里有以下问题点大家必须注意:

  1. 远程视图参数只能在WHERE字句中设定,其他的连接子句、分组字句、排序子句都不支持这一特性。比如不可以出现 Order by ?cOrder。(有传言说 Visual FoxPro 7 支持参数加入排序子句,但笔者还未及尝试)。
  2. 一个远程视图可以设定多个参数。实例见下面的代码。
  3. 远程视图的SELECT-SQL语句必须是以后端数据库的语法为标准。例如,SQL Server以单引号确认字符串,而Visual FoxPro可使用双引号、方括号、单引号确认字符串,那么如下语句是错误:
    CREATE SQL VIEW VCustomers REMOTE CONNECTION Northwind SHARE ;
    AS SELECT * FROM Customers WHERE customerid LIKE "ALFKI"
    又如,Visual FoxPro中删除字符型字段的空格可使用ALLTR()函数,但远程视图的SELECT-SQL中不能用任何Visual FoxPro的函数,所以要实现上述功能,应如下使用SQL Server的函数:
    CREATE SQL VIEW VCustomers REMOTE CONNECTION Northwind SHARE ;
    AS SELECT customerid,LTRIM(RTRIM(CompanyName)) FROM Customers WHERE customerid LIKE 'ALFKI'
  4. 第三点中我们强调了远程视图构建时必须使用后端数据库认识的Select-SQL。当远程视图被打开,成为Visual FoxPro的光标时,就可以对它使用Visual FoxPro的命令与函数。

CREATE SQL VIEW VEmployees;
REMOTE CONNECTION Northwind SHARE
AS SELECT EmployeeID,Birthdate FROM Employees
WHERE BirthDate >?dBirthdate1 AND BirthDate <?dBirthdate2
dBirthdate1='19540101'
dBirthdate2='19601231'
USE VEmployees
BROWSE
*本例对日期型字段Birthdate使用了两个参数,并请注意日期型参数的传递。
CREATE SQL VIEW VEmployees1;
REMOTE CONNECTION Northwind SHARE;
AS SELECT EmployeeID, BirthDate, Country FROM Employees;
WHERE birthDate > ?dBirthdate AND Country = ?cCountry
dBirthdate='19601231'
cCountry='uk'
USE VEmployees1
BROWSE
*本例对两个字段设定了参数

只下载有用的字段

上文中我们使用 SELECT * 从远端一古脑儿把所有列都下载到客户机,这样做不好。原因如下:

  1. 对远程数据操作时并不是所有的列(字段)都会被我们用到,特别是备注字段、大二进制字段。
  2. 在视图阶段就可以通过计算有关列得到更有用的信息,见下面的代码。
  3. 明确指定列信息有助于Visual FoxPro对远程数据表的版本控制。如果使用 SELECT *,那么只有在远程数据表增加字段时Visual FoxPro才知道,其他如减少、变更列的结构Visual FoxPro都不会知道。

例如:远程表中有FirstName,LastName列,我们在制作报表时只需要全名就可以了,那么我们解可以将它们相加成为一个新的列。

CREATE SQL VIEW VEmployees1 ;
REMOTE CONNECTION Northwind SHARE ;
AS SELECT EmployeeID, FirstName +' '+ LastName AS Name, Title ;
FROM Employees

多表连接形成的远程视图

远程视图不仅支持远程一个表的操作,它还支持多表连接,如下:

CREATE SQL VIEW VEmployeeTerritories ;
REMOTE CONNECTION Northwind SHARE ;
AS SELECT Territories.TerritoryID, Territories.TerritoryDescription, Employees.EmployeeID,;
Employees.LastName, Employees.FirstName;
FROM Territories INNER JOIN;
EmployeeTerritories ON ;
Territories.TerritoryID = EmployeeTerritories.TerritoryID INNER JOIN;
Employees ON EmployeeTerritories.EmployeeID = Employees.EmployeeID

远程视图还支持自连接,如下:

CREATE SQL VIEW VEmployeeReportTO ;
REMOTE CONNECTION Northwind SHARE ;
AS SELECT Employees.EmployeeID as 领导工号,;
Employees.FirstName+' '+ Employees.LastName as 领导,;
Employees_a.FirstName +' '+ Employees_a.LastName as 下属,;
Employees_a.ReportsTo as 上级领导工号;
FROM Employees Employees INNER JOIN;
Employees Employees_a ON ;
Employees.EmployeeID = Employees_a.ReportsTo;
ORDER BY Employees_a.ReportsTo

从上面的语句大家可以发现:Visual FoxPro中的 SQL 与SQL Server 中的 SQL 十分相似,这方便了学习,但千万别陷入了“温柔陷阱”!

时间: 2024-09-11 15:50:57

用vfp与sql server构建Client/Server应用程序(远程视图)(2)的相关文章

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

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

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

刷新缓冲(refreshing buffers) 记得在"以缓冲理解更新冲突"一节中我们提到过什么情况下Visual FoxPro会刷新缓冲区.其中"远程视图光标被打开"是很好的理解,这里不再累述. 以 REQUERY()函数刷新远程视图光标 REQUERY()函数的作用就是重新执行远程视图的SELECT-SQL描述,也就是重新打开远程视图光标,所以对系统造成较大的负担.对于这个函数,我有几点建议: 执行成功,返回:1:反之,函数返回:0. 执行成功,记录指针将停在

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

一些题外话 最近有一种好的现象--越来越多的Visual FoxPro用户开始注意到Client/Server应用程序的重要性,他们开始安装SQL Server了.作为开发人员,我们没有必要深入认识SQL Server的种种(我个人以为那是数据库管理员-DBA的事情),我们要解决的是怎样使Visual FoxPro与SQL Server在一起顺利的运行,怎样发挥两者的优越特性. "远程视图"一章已经涉及到了许多深层次的问题,但遗憾的是(可能是文章太过枯燥)很少有人关注它!笔者到现在还是

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

缓冲(Buffering) Visual FoxPro 中的缓冲技术 当远端数据下载到客户端时,这些数据就被压入缓冲之中.在客户端用户对数据的各种移动并不反映到数据源,而是在用户确认对数据的变动后,才把各种变动以SQL描述的形式发送到后端.那么为什么不让Visual FoxPro直接一步一动的操控远程数据,就像在不使用缓冲技术控制Visual FoxPro本地数据那样.我想原因在于: 在 Client/Server 构架的应用中,数据库服务器需要同时处理许多客户的请求,如果有一个客户"直接&qu

用vfp与sql server构建Client/Server应用程序(SPT)(2)

把数据集设为可更新 Visual FoxPro的光标类型 光标的英文称呼是Cursor,在Visual FoxPro中习惯的提法是临时表(Temp Table),不过我想应该根据惯例叫它光标.因为Visual FoxPro的光标绝对强劲,如果称呼Temp Table恐造成误会,好像Visual FoxPro不支持光标一样. Visual FoxPro的光标有三种:只读光标.可读写光标.可更新光标. 只读光标是那种不能被修改的光标,在Visual FoxPro中使用SQL-Select语句产生的光

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

可更新视图(Updateble views) 上面我们讲解了"怎样通过远程视图从服务器中把数据读取过来",接着我们要讲解怎样操作远程视图光标,当然我们不会在这里讨论一些Visual FoxPro数据集的普通操作,这里我们只讲解远程视图的数据更新. 当远程视图被打开,用户就可以使用Visual FoxPro的命令与函数作光标进行各种操作,例如查询.新添数据.删除记录.修改记录等,后三者都会使数据发生变动,远程视图有着自动分析各种变动并把变动的结果发送到后端数据库更新数据源的功能. 顺便提

Browser/Server与Client/Server模式优缺点对比

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   browser/server具有分布性特点,可以随时随地进行业务处理.业务扩展简单方便,通过增加网页即可增加服务器功能.维护简单方便,只需要改变网页,即可实现所有用户的同步更新.开发简单,共享性强. 个性化特点明显降低,无法实现具有个性化的设计要求.操作的习惯性是以鼠标为最基本的操作方式,无法满足快速操作的要求.页面动态刷新,响应速度明显降低.专用性打印输出难以

vfp远程视图与spt应用详解

远程视图(Remote Views)与SPT(SQL pass through)是vfp为开发Client/Server程序提供的两个内置的解决方案,如果您更深入的应用vfp,这两部分的内容是必须掌握的. 由于内容比较多,文章分成若干篇几次发完.但个人认为,远程视图与spt又是不可分割的整体,虽然spt应用得比较多,但若对远程视图没有比较深入的了解,我想你也不见得能用好spt. 因此做了这个目录,希望您能从远程视图开始,逐步了解这两个伟大的开发工具的使用. 用vfp与sql server构建Cl

使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序

server|web|程序|全文搜索 使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序 Andrew B. CenciniMicrosoft Corporation 2002年12月 适用于:    Microsoft SQL Server 2000摘要:学习如何充分利用 SQL Server 2000 的全文搜索功能.本文包含有关实现最大吞吐率和最佳性能的几点提示和技巧. 目录简介 全文搜索功能简介 配置全文搜索功能 全文查询 排位和优化 其他