Visual FoxPro 9中新的数据处理方式

作者:凯旋网络来源:凯旋网络
Visual FoXPro 9.0与以前的版本相比,在数据引擎上做了很大的改进。从增强的SQL语言到支持新的数据类型和索引都作了增强,本文阐述了这个最新版本作为一个成熟开发平台的魅力。

  数据引擎的改变主要体现在以下5个方面:

  · 增强的SQL语言:取消了很多硬编码的限制,增强了子查询和关联查询的支持,支持更复杂的表达式,以及增强了对UNION的支持。

  · 性能方面:加入了一个全新的索引方式,增加了过滤型索引的性能,提高了了TOP n ,MIN()/MAX()以及LIKE这些查询子句的性能。

  · 命令和函数:对数据操作的更具灵活性,增强对SQL中showplan的支持,增加ICASE()来代替IIF()函数。

  · 新的数据类型:支持VarChar、VarBinary和BLOB等新的数据类型,并提供相应的类型转换函数:CAST()。增强了现有函数对数据类型的控制和转换能力

  · 远程数据:增强了事务控制的能力,游标机制使得代码逻辑更加清楚,并且对CursorAdapter作了加强,使开发者只需数行代码就可以方便地访问远程视图。

  由于提供了与SQL Server强有力的互操作性,Visual FoxPro 9对客户端/服务器模式做了很大的改进。通过支持新的数据类型,并取消了SQL语言的诸多限制,同一套代码可同时运行在本地数据引擎和SQL Server这两种不同的数据源上。

  以上是大致的描述,下面让我们深入剖析这些新增功能。

  SQL子查询的增强

  假如要用一句话来表示SQL子查询的增强程度,那就是:“太多了”!SQL语句中再没有了元素数量的硬编码限制。一个简单的SELECT语句能包括更多的表、连接、子查询、嵌套子查询和联结。

  SQL语句中的IN子句中再也没有数量限制。在以前的版本中IN实际被映射到了一个名字INLIST()函数中,但现在这种依靠取消了。这个改变使得IN子句能使用更多的参数来生成非常复杂的SQL语句。与原来版本不同,只要找到相应记录,Visual FoxPro 9会自动停止计算IN子句中的表达式,这将带来性能的提高。

  完全无限制?

  IN参数表的元素也不是完全无限的,它的最大数量等于函数SYS(3055)的返回值,而这个函数的返回值与实际可用内存有关,因此假如你的可用内存越大,那么IN子句支持的元素就越多。无硬编码的限制并不等于完全无限制。像可用内存以及表达式的复杂性都能决定是否能运行一个非常长而且复杂的语句,你要花很大的功夫才能找出它们在你的机器上的真实极限。

  增强的子查询功能

  子查询在SQL语言中是一个很有用的功能。它一般处于WHERE子句中的右边,充当一个选择器的作用。在Visual FoxPro 9中,子查询还可以处于SELECT的参数列表中(称为投影)以及FROM子句中(称为派生表)。

  当你使用投影时,假如子查询没有返回任何记录,那将返加一个空值(NULL)。投影还答应互相关联,以后我们会讲到这点。
以下使用投影的SQL语句的一个例子:

SELECT ;
C.CustomerID, ;
C.CompanyName, ;
(SELECT YTD_Sales FROM Sales_02 WHERE ;
C.CustomerID = Sales_02.CustomerID) AS Y02,;
(SELECT YTD_Sales FROM Sales_03 WHERE ;
C.CustomerID = Sales_03.CustomerID) AS Y03,;
(SELECT YTD_Sales FROM Sales_04 WHERE ;
C.CustomerID = Sales_04.CustomerID) AS Y04 ;
FROM Customers C

  这个SELECT语句返回最后三个会计年度的客户ID和公司名称。

  使用投影的限制是子查询只能查询一个字段,并且子查询返回的记录数不能大于1。

  投影的另一个有价值的使用方法是它可以成为表达式的一部分,如下所示:

SELECT ;
C.customerID, ;
C.companyname, ;
SUM(D.quantity*D.unitprice) AS CustTotal ,;
(SUM(D.quantity*D.unitprice) / ;
(SELECT SUM((quantity*unitprice)-discount) ;
FROM OrderDetails D2) ;
)*100 AS PctTotal ;
FROM Customers C ;
INNER JOIN Orders O ;
ON C.customerID = O.customerID ;
INNER JOIN OrderDetails D ;
ON O.orderid = D.orderid ;
GROUP BY C.customerID, C.companyname, O.orderID ;
ORDER BY pctTotal DESC

 
  • 广告推荐