
用vfp与sql_server构建Client.doc
41页用 vfp 与 sql server 构建 Client/Server 应用程序(远程视图)(1)本文是《用 Visual FoxPro 与 SQL Server 构建 Client/Server 应用程序》系列的一部分,照例“远程视图”应不是开篇章节,但我们发现:在我们为网站准备的文章中有太多的理论性的东西,为了缓解这一矛盾,我们决定把“远程视图”提上来先写当下最流行的 ADO 脱胎于 Visual FoxPro,在实际使用中两者各有特色,所以不要小看 Visual FoxPro 在远程数据处理上的能力,它绝对强大!读者可以参看本站的《Microsoft Visual FoxPro 开发人员 ADO 快速入门》与《Visual FoxPro 漫谈》我们希望通过连载的形式完成《用 Visual FoxPro 与 SQL Server 构建 Client/Server 应用程序》一文,非常希望得到您宝贵的建议说在前面由于本文是在两天之内赶出来的,构思不够严密,我在选择 SQL Server 端数据库时犯了一个错误:Northwind 数据库中绝大多数“字符串”型字段(列)使用了 nVarchar 型,Visual FoxPro 对此支持的不好(具体原因本站将另文论述)。
以上可能造成演示程序不能正常工作,对此我们可以在 SQL Server 的 Enterprise Manager 中把有关字段的的类型从 nVarchar 改为 Varchar我建议把 Customers 表中的 CustomerID 和 Phone 字段的类型变化即可同样的,我们可以把 Employees 的 Notes 字段类型变为 text不是我的错Visual FoxPro 的视图设计器虽然能完成许多烦人的远程视图的操作,但对于特别复杂的远程视图可能会支持很差在阅读本文做实验时,遇到以上问题请不要责怪作者Visual FoxPro 的远程视图的功能非常强大的,大到工具程序“视图设计器”不能很好的支持!前言Visual FoxPro 为 Client/Server 构架的应用提供了两个内置的解决方案:远程视图(Remote Views)与 SPT(SQL pass through)当然在 Visual FoxPro 中我们可以使用其它的远程数据连接的方法,比如 ADO所有这些解决方案都各有优劣,远程视图最大的好处就是它可以非常方便地与 Visual FoxPro 内置控件绑定每一个远程视图就是一个存储于 Visual FoxPro 数据库容器(DBC)的对象,是一句 SQL-SELECT 语句。
远程视图通过 ODBC(Open Database Connectivity)与异构数据库通讯虽然本文的实例使用 SQL Server 作为后端数据库,但大家同样可以使用其它数据源作为后端数据库,例如 Oracle,IBM DB2,Informix,Sybase,Microsoft Access,Excel,甚至是 Visual FoxPro 自己使用远程视图操作远程数据就像操作 Visual FoxPro 本地数据一般,以下我们将介绍这一伟大工具的初级应用连接-Connections使用远程视图操作远程数据的第一步就是建立与远程数据源的通讯,这里有好几种方法可供选择,请注意所有这些方法都使用 ODBC 与远程数据连接这里有一个非常简单的远程视图,它的作用是:读取 Northwind 数据库中 Customers 表的记录到远程视图 Vcustomers 中CREATE SQL VIEW Vcustomers ;REMOTE CONNECTION Northwind ;AS SELECT * From Customers*先别试用这条语句,因为连接还没有建立在上述命令的第二行我们告诉 Visual FoxPro 使用连接 Northwind 与 SQL Server 通讯。
在运行上面的语句时,Visual FoxPro 将在两个地方寻找这个连接:1. 当前 数据库容器(DBC)中查看是否存在数据库“连接对象”——Northwind笔者称之为基于 DSN 的连接对象 2. 如果没有发现,Visual FoxPro 将在客户机的 OCBC Data Source Names(DSNs)中查看是否存在连接 Northwind笔者称之为 DSN 连接建立 DSNs 连接建立连接的最快、最方便的方法是建立 DSNs,您可以在控制面板中打开 ODBC 控制器,如图 1图 1. ODBC Data Source Administrator 面板我们发现有三种 DSN 连接:用户型 DSN、系统型 DSN、文件型 DSN其中用户型只对建立它的用户有效,譬如你以 Administrator 的身份登录系统并建立了一个用户 DSN,那么除非你以 Administrator 登录系统否则你不能使用这一 DSN;系统型则对当前用机器所有用户生效,无论你以什么身份登录系统;文件型 DSN 实际上是一个以 DSN 为后缀名的文本文件从 Visual FoxPro 的角度,笔者把这三种 DSN 分成两类:1. 用户型、系统型 DSN。
它可以单独作为连接为远程视图使用;也可以作为“基于 DSN 连接对象”的基础,“基于 DSN 连接对象”依赖于用户型或是系统型 DSN 2. 文件型 DSN它不可以单独作为连接为远程视图使用;它可以为设计“基于字符串的连接对象”提供资料,但“基于字符串的连接对象”不依赖于文件型 DSN我们先建立一个系统型 DSN在 ODBC Data Source Administrator 面板中选中 “System DSN”页,按“Add”键,再选择 SQL Server 驱动程序,按“完成”按钮出现图 2图 2. 设定 DSN 的名称及服务器这里我们选择“(local)”,注意如果系统将尝试连接目标服务器如果无法连接将报错,如果顺利的话您将看到图 3的画面,要求选择用户认证方式,这里我们选择 SQL Server 与 Windows 混合认证方式,并输入登录 SQL Server 的用户名:“sa”,口令为空图 3. 设定 DSN 的登录信息如果顺利画面 4 将出现在屏幕上,这里有一个选项要特别的注意,就是选择目标数据库这里我们当然是选“Northwind”图 4. 设定 DSN 的登录数据库废话就不多说了,如果一些顺利,这条叫“Northwind”的 System DSN 就建成了。
在 Visual FoxPro 的命令窗口中建立如下语句:CREATE DATABASE Northwind*建立本地数据库容器,存储数据库对象CREATE SQL VIEW VCustomers ;REMOTE CONNECTION Northwind ;AS SELECT * FROM Customers*建立远程视图,注意这个视图是数据库(DBC)的一个对象,所以必须先建立 DBCUSE VCustomers*打开远程视图BROWSE*浏览远程视图建立数据库容器(DBC)中的“连接对象”记得在前文我们讲过连接可以存在于两个地方,就是 DSNs 与 DBC,那么 DSN 与基于 DSN 的连接对象有什么区别?基于 DSN 的连接对象可以为数个远程视图共享,而 DSN 连接不可以我们知道,每一条与 SQL Server 的连接都是要收费的,共享连接就可以省钱;我们还知道,SQL Server 管理每条连接大约要花去 24K 的内存空间,有人讲:24K 不多,但您别忘了 SQL Server 是服务器,不只是您一个人使用它——东一条连接、西一条连接——系统效率一定会受影响因此无论从开发成本还是系统工作效率的角度,共享连接都是开发人员必然的选择。
为了说明什么是共享连接,为了证明 DSN 连接不能为试图共享,我们做以下试验:CREATE SQL VIEW VOrders ;REMOTE CONNECTION Northwind SHARE;AS SELECT * FROM Orders*新建一个远程视图,仍然使用名称为 Northwind 的 DSN 连接DBSETPROP('VCustomers', 'View', 'ShareConnection', .T.)USE VCustomers IN 0*打开刚才的那个视图USE VOrders IN 0*打开新建的远程视图?CURSORGETPROP("ConnectHandle", "VCustomers")*显示 1?CURSORGETPROP("ConnectHandle", "VOrders")*显示 2*这两个远程视图(光标)的连接句柄不是同一个如果一条连接被共享了,那么这两个光标的连接句柄应是同一个数字;这两个视图虽然使用同一个 DSN 但实际上它们没有共享连接为了使用共享连接着一特性,我们建立“基于 DSN 的 连接对象”:CREATE CONNECTION Northwind DATASOURCE Northwind以上这条连接是建立在上面我们建立的 DSN 连接之上的,连接成为数据库容器的一个对象了。
但注意:这种连接对象并不能摆脱 DSN 的控制,它的连接信息仍然存储在 DSN 中为了在视图间共享连接,我们必须设定设图的共享连接的属性,凡是参与共享连接的远程视图都必须具备共享连接的属性,否则共享连接还是不能实现设定共享连接的方法有两种:1. 建立视图设计使用关键字 SHARE如:CREATE SQL VIEW VOrders ;REMOTE CONNECTION Northwind SHARE;AS SELECT * FROM Orders 2. 设定已视图的 ShareConnection 的属性为.t.如:DBSETPROP('VCustomers', 'View', 'ShareConnection', .T.) 为了证明连接共享的特性我们执行以下代码:USE VCustomers IN 0USE VOrders IN 0?CURSORGETPROP("ConnectHandle", "VCustomers")*显示:1?CURSORGETPROP("ConnectHandle", "VOrders")*显示:1我们已经学习了怎样建立“基于 DSN 的连接对象”,并了解了连接共享。
仔细思考,您也许会发现“基于 DSN 的连接对象”存在下列问题:1. 运行时(RUN TIME)的可控性差比如我们希望应用程序在不同的条件下使用不同的用户登录数据库服务器、或是不同的数据库,是不是要建立 N 个 DSN 以及 N 个“基于 DSN 的连接”?太可怕了! 2. 由于“基于 DSN 的连接”对 DSN 的依赖性很强,例如:用户删除或是更改了 DSN 信息,那么我们应用程序就无法正常运行了!为了解决以上问题,Visual FoxPro 提出了“连接字符串的概念”笔者称之为:基于字符串的连接一个连接字符串基本上包括五个主要内容:ODBC 驱动器、服务器、用户名、登录名、数据库针对 SQL Server 而言)CREATE CONNECTION Northwind2 ;CONNSTRING "DRIVER=SQL;UID=sa;DATABASE=Northwind;SERVER=(local);PWD="用 vfp 与 sql server 构建 Client/Server 应用程序(远程视图)(2)通过工具建立连接以上我们都是通过命令的方式建立连接,现在我们将使用 Visual FoxPro 提供的连接设计器建立连接。
上文我们讲到:连接对象分为两类:“基于 DSN 的连接对象”和“基于字符串的连接对象”图 5:1. 在连接设计器中选择“数据源、用户标识、密码”就说明在建立“基于 DSN。
