vfp常见问题解答  
 
Q : VFP访问外部数据源的几种方法?
HashCode: liurixiaowei_2002liujianjun_、liujianjun_、cxmcxm、cxmcxm、cxmcxm、lshdf、liuri、liuri、liujianjun_、mudong、Haiwerzhuzhichao641856

Visual  FoxPro(以下简称VFP)是微软公司Visual系列开发工具中的一种。在VFP  6.0中,与外部数据源进行数据交换的方式有导入导出数据、远程视图、SQL  Pass  Through以及数据升迁等几种方式。其中,导入导出数据是完成对静态数据(或文本)的数据转换,而对动态数据源的访问则需要使用Windows中的ODBC技术。  
本人想收集在设计客户/  服务器体系结构的应用程序时,如何使用VFP来实现与外部数据源的数据交换?以及各种方法的优、缺点.有程序举例最好!(高分相送,希望大家支持,分不够还可以再加)  
---------------------------------------------------------------  
 
访问access,先建立数据源,  
jb=sqlexec("数据源名")  
然后就可以和sql  server相连一样操作了。  
sqlexec(jb,"select  *  from  tablename","lsb")  
 
sele  lsb  
brow  
 
---------------------------------------------------------------  
 
conn=createobject("adodb.connection")  
conn.connectionstring="provider=microsoft.jet.oledb.4.0;data  source='d:\db1.mdb'"  
 
conn.open  
---------------------------------------------------------------  
 
对C/S,数据操作用远程视图,复杂的查询或执行存储过程用SPT.  
---------------------------------------------------------------  
 
在VFP用ADO虽可连接数据库,但ADO与VFP的控件不兼容,最好不用。  
---------------------------------------------------------------  
 
MSDN中VPF程序员指南中有三章专门讲C/S程序设计,建议精读。  
---------------------------------------------------------------  
 
Visual  FoxPro  6.0与大型数据库的无"数据源"连接!!(不可不看!!!)  
http://www.yesky.com/20020225/218569.shtml  
---------------------------------------------------------------  
 
(转贴)  
 
如何创建远程连接和远程视图.    
CLOSE  ALL  
SET  DEFAULT  TO  c:\temp  
*  没有数据库视图不能存在.因此创建一个用于包含视图的数据库.  
CREATE  DATABASE  zdb  
*  创建一个视图使用的连接.  
CREATE  CONNECTION  zconn  DATASOURCE  sqltest  USERID  sa  PASSWORD  ""  
*  用远程连接创建视图.  
CREATE  SQL  VIEW  zview  REMOTE  CONNECTION  zconn  AS  select  *  from        pubs..sales  
*  打开视图并浏览结果集.  
USE  zview  
BROWSE  
 
 
设置  ODBC  数据源  
DECLARE  INTEGER  SQLConfigDataSource  IN  odbccp32  INTEGER,  INTEGER,  STRING,  STRING  
 
lnWindowHandle=0  
lcODBCDriver='SQL  Server'  &&  DRIVER  类型  
lcODBCName='SharedData'      &&  数据源名字  
lcODBCDesc='Shared  Data  Source'  &&  数据源描述  
lcODBCServer='DEVSQL'          &&  SQL  SERVER名字  
lcODBCDatabase='Shared'      &&  要连接的数据库名字  
 
**  先试图修改已有的  ODBC,如果不存在,返回  0。  
lreturn=SQLConfigDataSource(lnWindowHandle,  2,  lcODBCDriver,  ;  
'DSN='  +  lcODBCName  +  CHR(0)  ;  
+  'Description='  +  lcODBCDesc  +  CHR(0)  ;  
+  'Server='  +  lcODBCServer  +  CHR(0)  ;  
+  'Database='  +  lcODBCDatabase  +  CHR(0))  
IF  lreturn=0  &&  不存在  
 
     **  添加新的  ODBC  
     lreturn=SQLConfigDataSource(lnWindowHandle,  1,  lcODBCDriver,  ;  
     'DSN='  +  lcODBCName  +  CHR(0)  ;  
     +  'Description='  +  lcODBCDesc  +  CHR(0)  ;  
     +  'Server='  +  lcODBCServer  +  CHR(0)  ;  
     +  'Database='  +  lcODBCDatabase  +  CHR(0))  
     IF  lreturn=0  &&失败  
           MessageBox('添加ODBC数据源失败',16,'BUFFER')  
     ENDIF  
ENDIF  
 
 
删除ODBC数据源  
DECLARE  INTEGER  SQLConfigDataSource  IN  odbccp32  INTEGER,  INTEGER,  STRING,  STRING  
 
lnWindowHandle=0  
lcODBCDriver='SQL  Server'  
lcODBCName='SharedData'  
lcODBCDesc='Shared  Data  Source'  
lcODBCServer='DEVSQL'  
lcODBCDatabase='Shared'  
 
**先修改,或者其是否存在  
lreturn=SQLConfigDataSource(lnWindowHandle,  ;  
     2,  lcODBCDriver,  ;  
     'DSN='  +  lcODBCName  +  CHR(0)  ;  
     +  'Description='  +  lcODBCDesc  +  CHR(0)  ;  
     +  'Server='  +  lcODBCServer  +  CHR(0)  ;  
     +  'Database='  +  lcODBCDatabase  +  CHR(0))  
IF  lreturn=1  &&ODBC存在,删除它  
           lreturn=SQLConfigDataSource(lnWindowHandle,  ;  
           3,  lcODBCDriver,  ;  
           'DSN='  +  lcODBCName  +  CHR(0)  ;  
           +  'Description='  +  lcODBCDesc  +  CHR(0)  ;  
           +  'Server='  +  lcODBCServer  +  CHR(0)  ;  
           +  'Database='  +  lcODBCDatabase  +  CHR(0))  
           IF  lreturn=0  
                 MessageBox('删除ODBC源失败,16,'BUFFER')  
           ENDIF  
ENDIF  
 
**  清除DLL  
CLEAR  DLLS  
 
 
从VFP连接到SQL  SERVER  
lnHandle=SQLConnect("SharedData","用户名”,“密码”)  
If  lnHandle>0  &&连接成功  
     **从库里获得数据(比如从EMP表里得到部门号为‘01’的职工)  
     lnReturn=SQLExec(lnHandle,"Select  *  from  Emp  Where  cDept='01'","CursorEmp")  
     If  lnReturn>0  &&运行成功  
           Browse  
     Else  &&失败  
           &&出错处理  
     EndIf  
Else  &&连接失败  
     MessageBox("连接  SQL  SERVER  失败”,16,“BUFFER”)  
EndIf  
 
**用完连接后,最好马上关闭,连接是很宝贵的资源,微软是按连接数收费的,而且每个连接会增加SQL  SERVER的管理负担  
=SQLDisconnect(lnHandle)  
 
 
---------------------------------------------------------------  
 
Visual  FoxPro  的客户/服务器开发    
 
节选自《Visual  FoxPro  3  编码手册》,Y.Alan  Griver  著    
 
1995  年  8  月  1  日    
 
介绍    
 
随着  Visual  FoxPro  的发布,Microsoft  已经把  FoxPro  定位在客户/服务器结构的前端(客户端)。Visual  FoxPro  包含了大量访问后端信息的途径,加上相当快的本地数据库引擎和数据字典,它提供了真正的客户/服务器开发所需的最好选择。本文将要研究  Visual  FoxPro  中内置的各种远程数据访问功能,同时介绍在什么情况下使用这些功能。    
 
客户/服务器基础    
 
在讨论  Visual  FoxPro  客户端功能之前,让我们研究一下为什么要使用远程服务器。    
 
广域网  (WAN)    如果您使用WAN,平均来说,客户/服务器应用程序能够降低网络  I/O,提高吞吐量。    
 
在大数据库中每次只需查询很少的结果        使用客户/服务器结构的一个根本动机是希望通过电缆的信息量最小;因此您通常要预先限定查询,使得服务器只将必须的信息发送到客户端。例如,若要了解一个客户的信息,可以在查询中只请求那个客户的数据,而不是浏览所有客户的信息。    
 
服务器强制安全性检查和健壮的事务处理  服务器数据库产品能为您的数据提供安全性和健壮的事务处理机制。而非服务器数据库(比如  Visual  FoxPro)只能提供一些简单的事务支持和数据完整性检查,这些特性同内置在各种服务器引擎之中的功能是无法相比的。    
 
上面列出了使用客户/服务器结构的各种原因,现在我们看一下  FoxPro  所提供访问服务器数据的两种方法:SQL  pass-through  (SPT)  和视图。SQL  pass-through  提供与  FoxPro2.6  Connectivity  Kit  相同的基本能力,但它已内置在基本产品中,并具有更快的速度。视图支持允许您象处理本地  FoxPro  数据一样处理后端数据,但是必须注意结果集合的大小。这两种方法都要用到连接,即具有给定别名、预先定义的联系后端数据的途径。    
 
您可以为连接设置多个属性:    
 
           Asynchronous  连接是同步的(在完成后端的查询之前您的应用程序不能继续)还是异步的    
 
           BatchMode(在我们重新得到控制权之前是否完成后端的多个  SQL  语句?)    
 
           Comment    
 
           ConnectString    
 
           ConnectTimeout    
 
           DataSource    
 
           DispLogin(何时需要显示一个注册对话框?)    
 
           DispWarnings(是否显示不可俘获错误)    
 
           IdleTimeout    
 
           PassWord    
 
           QueryTimeout    
 
           Transactions(自动或人工)    
 
           UserID    
 
           WaitTime    
 
所有这些都是可读/写属性。    
 
SQL  pass-through  函数    
 
SQL  pass-through  (SPT)  类似于低级文件函数:它使您可以直接访问开放数据库连接  (ODBC)  提供的功能和您的后端数据。SPT  需要您编写代码来打开连接、传递命令、检查错误等等。这些操作通过一组以“SQL”三个字母开头的函数来处理。    
 
要建立连接,使用  SQLCONNETC()  或  SQLSTRINGCONNETC()  函数,它们均返回一个连接句柄,这个句柄是  Visual  FoxPro  指定给该连接的编号。在后继  SPT  函数调用中都要使用这个句柄。这些函数只有可选参数,没有必须的参数。如果不带参数使用它们,函数自动调用“选择连接”或“数据源”对话框;如果传递参数,可以包括已定义的数据源名称、用户标识以及密码;或者是一个已存在的命名连接的名字。    
 
SQLSETPROP()  和  SQLGETPROP()  允许您设置或查看特定  SPT  句柄的属性。它们的工作方式与连接属性一样,不同的是您不能设置  Comment,ConnatSrring,Data  Source,Idle  Timeat  和  UserID  属性。而且您还能查看(但不能设置)ODBChdbc  和  ODBChsmt,它们分别是  ODBC  内部的连接和语句句柄,外部库文件  (FLL)  需要使用它们直接调用  ODBC。    
 
大量的  SPT  工作是用  SQLEXE()  函数完成的,它允许向后端传递一个可执行的  SQL  命令,它还具有一个可选的参数,指定一个可读写的临时表来存储结果集合。SQLMORERESULTS()  允许您在异步模式下检索更多的信息。    
 
SQLTABLES()  函数检索远程数据源中表的名称并存入本地临时表中。SQLCOLS()  函数检索指定远程数据库表中列的名称与列的信息,然后把那些信息存储进本地临时表中。    
 
如果一个  SPT  函数返回错误代号,它的值指示发生的错误是连接错误还是环境错误。SQLERROR()  用来返回有关错误的详细信息。SQLERROR()  将提供任何组件层次的信息。    
 
正如您所看到的,SQL  pass-through  函数提供了一