VFP与SQLServer的连接 (2007-03-13 00:59:43) VFP与SQL Server的连接(1) ----建立ODBC数据源(DSN) 摘要:本文主要讲解VFP到SQL Server的连接以及连接中应该注意的问题和错误的解决方法 这里所指的连接关系(connection)指的是当VFP通过界面卡、SQL Server 的网络架构、 传输媒介、通讯协议等复杂的作业组合后而连线到SQL Server的流程总称。 安全措施 相信大家都了解数据的机密性和重要性,所以您最好采取一些安全防护措施来保护它不被非法存取和蓄意破坏。事前做好万全的准备总比事后的懊悔好。 至于设定和维护资料的安全性是系统管理员(Administrator)的职责。 假如您的应用程序是C/S结构,那么程序的使用者都必须先通过身份验证以获得存取资料的权限,亦即使用者可利用在SQL中设定的使用者名称和密码,或直接用Windows NT 目录资料库中的使用者名称和密码来存取SQL资料库。(这种做法请与SQL系统管理员联系)。 输入用户名称和密码的一般做法 假如您的程序需要输入用户名称和密码的话,一般的做法是在屏幕上显示一个对话框让用户输入。在VFP中有一个TEXTBox 控件非常适合来担任这个工作,它有一个passchar属性,可以让开发者设计要以什么字符来遮没(通常是*,关于加密的程序以及算法可以参考VFP编程技巧)用户输入的密码。 建立ODBC数据源(DSN) ODBC数据源(Data Source Name : DSN)即是ODBC驱动程序的唯一识别名称,DSN可以包含空白的字符,如 “FAVOR CAI” 由控制面板的32BIt Odbc 图标,可以进入ODBC数据管理器,如果没有 32BIt Odbc 图标,请先安装ODBC驱动程序。 用户DSN是用户用来存贮与数据库的连接信息,用户数据源只对用户可见而且只能用于当前机器上。 系统DSN是用来存贮与数据库的连接信息,当前计算机上的所有用户都可以使用系统数据源。 文件DSN是用来存贮与数据库的连接信息,可以由安装了相同驱动程序的用户共享。 跟踪允许创建调用ODBC驱动程序的日志,以供技术人员查看或辅助调试应用程序。 双击[添加(D)]按钮,可以自行添加ODBC DSN,在弹出的“选择新数据源”对话框中,选择SQL Server 驱动程序。 接下来,让我们来看看DSN的相关设定,在ODBC SQL Server 设定对话框提供了下列的设定选项: 1、Date Source Name(DSN):每一个ODBC驱动程序都有一个唯一的识别名称。 2、Description(说明):此说明资料来源,可省略不输入。 3、Server (服务器): 即SQL Server 所在的服务器名称,若SQL Server 在本机上执行的话,便可使用[Local ]预设值。 4、 Network Address:(网络地址):指SQL Server 资料库管理系统(DBMS)的地址,SQL Server 驱动程序再从DBMS 取回要存取的资料。假如您用的是MicroSoft SQL Server 的话,只要让这个栏位保留预设值(Default)即可,当你是透过TCP/IP建立的连接关系时才需设定它。 5、Network Library :指与网络程序沟通的SQL Server 驱动程序的Network library DLL名称 6、Option按钮:按一下,以设定Login 与Translation 的设定。 (1):Database Name :要存取SQL资料库的名称。 (2): Language Name:SQL Server 所指定的国家语言,除非你想让SQL Server以法文或德文来传递信息,不然只需让它保留预设值(Default)即可。 (3): Generate Stored Procedure for prepared Statements:这个选项被核取的话,SQL Server 将预备叙述PS(Prepared Statements)插入在程序中再加以编译为预存程序SP(Stored Procedure)。若清除这个检查框的核取,则PS将与SQL Server 驱动程序运作时执行与贮存。 (4): Translation:按下[Select]按钮后,选择翻译程序。 (5):Convert OEM To ANSI characters: 若SQL Server 和SQL Server 驱动程序都不使用ANSI字符的话,请核取这个检查框。 VFP与SQL Server的连接(2) ----怎样取得服务器名称和ODBC数据源 怎样取得服务器名称和ODBC数据源 通常程序不会询问用户所要使用的是那一个SQL Server 或是那一个数据源,但假如你必须这么做的话,您可以在屏幕上显示一个目前已在网络上启动或可被搜寻得到的SQL Server 或DSN 选择清单(最好把用户的使用权限也一起列举),也不要让用户自行在TextBox上输入,避免使用上的困扰。 技巧:可以用SQL Server 上的函数SqlServerEnum来搜寻网络上已经安装的SQL 服务器。ODBC登录对话框照理来说,一般应用程序被执行时应该看不到ODBC 的登入对话框,但如果没有作好适当的设定时,那么一旦ODBC驱动程序管理员接收到应用程序存取ODBC失败的信息时,屏幕上便会出现ODBC登录对话框。也许您会感觉这个对话框跟您见到的对话框不同,这个对话框之所以出现,是因为用户没有通过DSN的身份验证造成。假如您指定了一个确实可供存取的DSN的话,将出现另一种登录对话框。这是正确指定DSN才出现的对话框,唯一美中不足的是无法禁止用户按下[OPTION>>]按钮,进而更改其登录的高级设定。 测试数据源 为了避免在调试程序时,带来不必要的麻烦,应该在建立好DSN后,对DSN进行测试。在VFP中你可以用 SqlConnect( )或者SQLSTRINGCONNECT( )函数来对DSN进行测试。 下面说说详细的测试方法 测试方法:? SqlConnect(数据源,用户,密码) 例如: ? SqlConnect("EDSTW","sa","") 如果函数返回-1,表明数据源无法连接,请检查数据源或者检查SQL服务器是否正常。返回正数,表明数据源连接成功。该返回数代表当前连接的SQL句柄。 连接管理 网络上的数据库若被单一用户独占的话,就豪无意义可言,SQL Server的资料库界面改善了前端的应用程序来存取数据库的效率,让多个CLIENT可同时透过同一连接关系去存取数据。 动态连接模式 以往若应用程序需多次存取某一数据库的话,便会与该数据库一直保持连接关系,如此因长期独占而导致该连接关系处于空闲状态,浪费资源。 现在VFP加入连接共享以及空闲关闭的功能。 及时开启连接关系:连接不活动前允许在指定的时间分钟数内空闲。如果在指定时间内没有请求使用服务器,则 Visual FoxPro 终止该连接。但是,连接超时后如果对服务器又有请求,则 Visual FoxPro 将试图自动恢复这个连接。因为连接是作为数据库的一部分存储的,所以仅在有打开的数据库时才能进行连接建立。 1:指定的数据源:有两种方式指定数据源,一种用字符串来指定,允许在文本框中键入连接串。另一种用DSN,用户标识,密码来指定: A:数据源 允许从已安装的 ODBC 数据源列表中选择一个数据源。 B:用户标识 如果数据源需要用户名称或标识,允许键入。 C:密码 如果数据源需要密码,允许键入密码。 D:数据库您可以选择一个数据库,作为所选数据源连接的目标。 指定DSN后您可以对刚输入了内容的连接进行连接验证。如果连接成功,则显示对话框提示此“连接成功”;如果连接失败,则出现错误信息。如果没有对连接指定内容,则显示“选择数据库” 对话框,使您可以选择数据源。 新的数据源 显示“Data Sources”对话框,使您可以添加、删除或配置数据源。 2:显示 ODBC 注册提示 此项设定ODBC登录信息对话框是否出现,什么时候出现。 A:仅当登录信息没有指定时:如果在命名连接定义中未存储用户标识和密码,则 Visual FoxPro 用“ODBC 数据源注册”对话框提示用户。 B: 每次都显示: 指定 Visual FoxPro 总是使用“ODBC 数据源注册”对话框提示用户,该框允许用户使用与存储在命名连接中不同的注册 ID 和密码。 C:从不指定: Visual FoxPro 从不提示用户。此选项确保更高的安全性。 3:数据处理 这里可以设置连接数据的处理方式 A:异步执行 指定异步连接。 B:显示警告信息 指定显示不可捕获警告。 C:批处理 指定以批处理方式进行连接操作。 (1):批处理方式 ---- 分批从表中取出设定的记录数(默认值100) (2):非批处理方式---- 一次取完整个表的数据 D:自动事务处理指定自动执行事务处理。 E: 数据包大小当和远程数据位置之间传送信息时,您可以指定传送信息网络包的大小(以字节为单位)。在下拉列表中选择或键入一个值。 4:超时时间间隔 这些选项设置连接属性的值,也可用 DBSETPROP( ) 函数设置。 A:连接(秒) 以秒为单位指定连接超时时间间隔。 B:查询(秒) 以秒为单位指定查询超时时间间隔。 C:空闲时间(分钟)以分钟为单位指定空闲超时时间间隔。在指定的时间间隔后,活动连接变为不活动。 D:等待时间(豪秒) 以毫秒为单位指定在 Visual FoxPro 确定 SQL 语句是否执行完毕之前经过的时间。 设定完毕后按下CTRL+W 键存盘。
VFP与SQL Server的连接(3)
----监视SQL Server 上的连接情况
在SQL Enterprise manager中的[Server /Current Activity]可以让您一目了然地看出SQL的连接情况,是个非常好用的工具。 在Current Activity中,可见到已登入的用户清单、数据库名称、工作站名称与应用程序名称。下方的状态栏显示目前有多少连接关系正在运作,多少连接关系处于空闲。 存取时限 一般连接关系的存取时限从15秒到1、2分钟不等,至于精确的数值要视你所选择的程序界面与时限的设定值而定。亦即假如你要存取数据库时,选择了不正确的服务器或服务器已经关机,则CLIENT端便会没有任何反应,一直到存取时限时,才会返回连接失败信息。 若要连接LAN网中的SQL SERVER不须耗费多少时间,约1至5秒内便能获得回应,应用程序第一次连接会花费较长的时间,第二次后会比较短。因为Windows系统会将先前的连接关系所用的控件或DLL文件一直保留在内存。 设定远程数据的存取方式 您可以自己设定取数据的处理方式,在VFP的TOOLS菜单里,选中Options... 菜单项,弹出OPTIONS对话框,选中Remote Data 标签: 1: 共享连接 指定 Visual FoxPro 使用当前连接处理新的视图。在数据源一次只支持一个连接时,它很有用。它可以使一个连接处理多个视图。 2:取备注字段指定只有在视图输出中激活一个备注或通用字段后才从数据源取备注或通用字段。清除该选项可以减少初始从远程表中下载的数据量,这将提高性能。 3:SQL 更新条件 指定当您试图更新数据前的数据对比方式,Visual FoxPro 检查远程服务器上的字段来决定是否改变数据。如果选择条件所指定远程字段中的数据已经更改,则更新失败。 (1):Key Fieds Only 只对比主键 (2):Key and Updateble Fieds 对比主键和要更新的字段 (3):Key and Modified Fieds 对比主键和修改过的字段(默认) (4):Key and Timestamp 对比主键和数据库的时间截。 4:SQL 更新 指定 Visual FoxPro 是使用 SQL UPDATE 还是使用 SQL DELETE,然后用 INSERT 来更新远程服务器上的信息。 (1):SQL Update 直接用SQL语言更新(默认) (2):SQL Delete + SQL Insert 删除旧记录,然后增加一条新记录 5:每次取的记录数 当用批处理方式时,指定 Visual FoxPro 从远程数据源中一次返回多少条记录。选定“全部”可以指定在第一次取操作中即返回所有的记录。该设置受“要取的最大记录数”中指定值的限制。 6:要取的最大记录数指定一个视图返回的记录总数。如果您错误地建立了一个查询,它可以防止返回过多的数据。选择“全部”可以指定返回所有的记录。 7:使用备注字段的长度 >= 指定长字符型字段中数据的最大长度。指定在视图输出中,如果字符数据超出指定长度时,将长字符字段转换成备注字段。默认值是255,等于 Visual FoxPro 中字符型字段的最大长度。 8:成批更新的记录数指定视图一次发送的更新语句数目。调整这个值可以明显地提高更新性能。默认值是 1。有关的详细内容,请参阅“REPLACE 命令”以及“Scope 子句”。 9:异步执行 指定把控制权返回给您的应用程序之后,Visual FoxPro 在后台执行 SQL pass-through 命令(使用 SQLEXEC( )、SQLMORERESULTS( )、SQLTABLES( ) 和 SQLCOLUMNS( ))。 如果您选定了该选项,您的应用程序可以显示过程信息,并且允许用户使用 ESC 键中断一个命令(如果 SET ESCAPE 已经设置为“真”)。您可以决定一个异步执行的 SQL 命令的状态,方法是重复地调用其中一个 SQL pass-through 函数,直至它报告命令已经完成为止。这个选项的默认值是废止(同步执行),它指定 Visual FoxPro 在把控制权返回您的应用程序之前一直等待,直至 pass-through SQL 命令完成为止。 10:显示警告信息 允许显示警告信息。 11:批处理 在使用 SQLEXEC( ) 发送多个 SQL pass-through 语句时,指定 Visual FoxPro 并不返回任何结果,直到所有结果集合都检索到为止。 对应于在 SQLSETPROP( ) 函数中设置 BatchMode。如果废止了该选项,您必须调用 SQLMORERESULTS( ) 来确定数据是否可用。 12:自动事务处理指定由远程表上的连接自动处理事务。如果清除了该选项,您必须使用 SQLCOMMIT( ) 和 SQLROLLBACK( ) 人工处理事务过程。 13:显示登录信息当一个连接激活时,指定是否显示登录提示(如果该连接需要用户进行登录)。例如,“只在必要时”指出,只有在连接或视图定义中未指定登录信息的情况下,才出现登录提示。 14:连接超时设定(秒)指定与远程服务器建立一个连接所需等待的秒数(0 到 600 之间)。如果在指定时间内不能建立这个连接,则 Visual FoxPro 显示错误。指定 0 为无限制地等待一个连接。 15:空闲超时设定(分钟)指定连接不活动前允许空闲时间的分钟数。如果在指定时间内没有请求使用服务器,则 Visual FoxPro 终止该连接。但是,连接超时后如果对服务器又有请求,则 Visual FoxPro 将试图自动恢复这个连接。 16:查询超时设定(秒) 指定等待服务器响应一个请求的秒数(0 与 600 之间)。如果服务器在指定秒数的时间内还不处理查询,则 Visual FoxPro 显示错误。指定 0 可以无限制地等待查询结果。 等待时间(毫秒) 指定 Visual FoxPro 检查 SQL 语句是否执行结束之前经过的毫秒数。VFP与SQL Server的连接(4) ----解决区域网络方面的连接问题 排除连接错误 C/S程序结构的运作就像是主人与仆人之间的互动一样,仆人偶尔会因沟通不良而抱怨。这种情况在C/S程序中即所谓的错误信息(Error message ),每个错误信息都包含了一个错误代码与描述问题的说明文字。由于各种程序的错误处理方式不尽相同,所以当我们在做除错工作之前,除了要参考错误信息外,还应当注意下列几个问题,以掌握可能的原因,提高效率。 错误原因 1:程序以往在执行时是否曾成功建立连接关系?如果是,后来有没有变更过什么设定?因为若曾经连接成功的话,那么在设定、安全、通讯协议等方面应该不会有问题。之后,假如有安装新版的应用程序、操作系统后升级驱动程序的话将影响连接情况。 2:屏幕上显示什么信息?Modem 或网络卡的LED显示是否正常?屏幕上的信息可以引导我们朝正确的方向排除错误。Modem 或网络卡的LED显示网络交通是否正常运作。 3:网络是否已超出负荷?用户是否搭错线,连接到其他的网络?也有可能许多应用系统一直站用网络资源造成网络异常。 4: 碰到错误时、程序有没有做除错措施或者直接关机。 程序库所引发的连接问题很多问题的发生都因为动态连接程序库(DLL)或控制元件(Control,即OCX),存放到其它目录或者根本没有安装到系统中,或由于安装了新版的ODBC 而覆盖掉旧版的ODBC所引起的。他们必须被放置到程序载入器(WIndows loader)在执行期间能找到的地方,一般在Windowssystem之下,而且这些程序应该在系统注册、安装,而不是直接放置到该目录就可以。 所有Windows 平台的Windows loader作业流程都是相同的,一旦程序档案总管、浏览器、执行.......等方式启动后,Windows loader 便会依次往下列几个地方搜寻相关的程序库或元件: 1: Momery 2: 应用程序所在的目录 3: Windows 的目录 4: Windowssystem目录 5: 环境变数所指定的目录 如果以上五个地方都找不到相关的程序库或元件的话,Windows便会告知用户错误信息。 Microsoft SQL Server 的Client 端是籍由named pips 与Server端沟通的,为了支持named Pips ,所有程序界面都采用16位元的DBNMP3.DLL或32位元的DBNMPNTW.DLL程序库。在强调一次,这些DLL档必须被放置在WindowsSystem或其他Windows loader 能找到的目录。 解决区域网络方面的连接问题 通常根据下列的问题及步骤来处理这方面的问题: 1:用户是否确实登入网络?这是常见的疏忽,因为用户经常只登入到工作站本身,而没有进入网络,这是您可以选择开始/关闭系统来关闭所有程序,登入成其他的用户,重新做一次登入。 2:是否还有连接空间让用户使用? 假如用户建立许多的连接关系后,忘了切断它,那么操作系统有可能无法建立新的连接,有些操作系统可供同时连接的数目是有限的,预设的状况下,假如用户同时用4、5条的远端连接关系后,这个用户若想再连线到SQL Server 就会有问题。 3:网络是否瘫痪?假如执行了很多个远端数据库存取程序都无回应的话,您可用[网络邻居]来检查其他机器上的共用目录是否依旧可以存取。 4:您是否曾用Client Configuration Utility 去设定装置的驱动程序后网络地址?当SQL Server 支援TCP/IP后,系统会要求您做相关的设定。因系统将参照网址而非用名称来存取服务器。 与SQL有关的连接问题通常根据下列的问题及步骤来处理这方面的问题 1:用户是否输入正确的登入ID和PASSWORD。 2:服务器有没有运作?当服务器开机时,是否有自动开启SQL Server?您可以在控制台的服务程序或用Startup.cmd 这个批处理文件来检视这项设定。也可以用SQL Server Manager 来确定SQL Server 是否正常运作: (1):服务器的RAM或硬盘空间是否太小了? (2):SQL Server 数据库中的资料是否以坏掉? (3):SQL SERVER 是否处于单机模式运作?或SQL的ADMINISTRATOR正在维护系统。 用户权利和授权问题 SQL SERVER 具有可连接超过1000个的用户的能力,但真正可同时连接的数目就要看Administrator 的设定了,每一条的连接关系都会消耗37KB至42KB大小不等的RAM,这些RAM是被用来充当程序或资料的快取空间之用。微软公司要求所有要存取WIndows NT 或SQL Server 的用户都必须取得用户端存取授权(Client Access License :ACL)。用户端存取授权和操作系统授权是分开的,用户端存取授权有两种:
1:每服务器模式(Per Server Mode):用户在用户端可与SQL Server 或Windows NT 建立n条连接关系。换而言之,不能同时有超过n个的连接关系存取服务器。
2:每一客户模式(per Seat Mode ):每个用户端都必须购买用户段存取权限,若同时连到NT & SQL Server 的连接关系已经超过每一客户的授权数目,用户端的用户仍然可继续连线上来。