第8章ADO基础 249 下载 82.2 Command对象 Command对象是对数据存储执行命令的对象。看到这里读者可能会产生疑问 Connection对象不也能这样做吗?是的,但是 Connection对象在处理命令的功能上受到一定的 制,而 Command对象是特别为处理命令的各方面问题而创建的。实际上,当从 Connection 对象中运行一条命令时,已经隐含地创建了一个 Command对象 有时其他对象允许向命令传入参数,但在 Connection对象中不能指定参数的任何细节。使 用 Command对象允许指定参数(以及输出参数和命令执行后的返回值)的精确细节(比如,数据 类型和长度)。 因此,除了执行命令和得到一系列返回记录,也可能得到一些由命令提供的附加信息 对于那些不返回任何记录的命令,如插入新数据或更新数据的SQL查询, Command对象 也是有用的。 823 Recordset对象 Recordset对象是ADO中使用最为普遍的对象,因为它含有从数据存储中提取的数据集 我们经常运行不返回数据的命令,比如那些增加或更新数据的命令,但在大多数情况下很有 可能会取得一系列记录。 Recordset对象是拥有这些记录的对象。可以更改(增加、更新和删除)记录集中的记录,上 下移动记录,过滤记录并只显示部分内容等等。 Recordset对象也包含 Fields集合, Fields集合 中有记录集中每一个字段(列)的 Filed对象 无论是在ASP页面中处理数据,还是利用远程数据服务(RDS)远程使用数据, Recordset对 象是必须处理的对象 824 Record对象 ADO2.5以前的版本在处理结构化数据上是很有效的,比如从数据库中取出记录集,但无 处理每一行的列(也就是列数和数据类型)可能不同的数据。对于SQL数据这不是一个问题, 但对于文件和邮件系统,Web服务器和别的诸如此类的数据存储会如何呢?我们把这些数据 看作是半结构化的数据,与记录集相比结构性较差,但与那些常用来代表文本或图像的二进 制数据相比更具有结构性 通常,半结构化数据的存储采用树状结构来组织,有节点、子节点和文件。例如,设想 个有文件夹、子文件夹和文件的Web站点。图8-4所示的屏幕图显示了一台机器的Web站点, 特别是还有一个名为 public的虚拟目录。 如果一定要在ADO中进行建模,会觉得这非常适合记录集,可能是嵌套的记录集。然而 注意高亮显示的目录,该目录含有不同类型的文件,里面有几个目录、一个ASP文件、一个 文本文件和一个WORD文档。你会很容易地将其映射到一个拥有名称、类型、上次存取时间 等字段的记录集,遗憾的是并不是这样简单。对于访问权限而言,在文件和目录之间就有区 别。对于目录,需要的是能访问目录下的文件:而对于文件,却可能是需要访问其内容 由于其复杂性,引入了 Record对象。在上面的情况下,存在有一些相同属性的条目的一个 集合,但是每个条目也有独特的属性,因此需要使用别的方法去处理这些数据。把一个集合映 射到一个记录集,一个单独的文件映射成一条记录,相应的文件属性就映射成 Fields集合
8.2.2 Command对象 C o m m a n d 对象是对数据存储执行命令的对象。看到这里读者可能会产生疑问, C o n n e c t i o n对象不也能这样做吗?是的,但是 C o n n e c t i o n对象在处理命令的功能上受到一定的 限制,而C o m m a n d对象是特别为处理命令的各方面问题而创建的。实际上,当从 C o n n e c t i o n 对象中运行一条命令时,已经隐含地创建了一个 C o m m a n d对象。 有时其他对象允许向命令传入参数,但在 C o n n e c t i o n对象中不能指定参数的任何细节。使 用C o m m a n d对象允许指定参数(以及输出参数和命令执行后的返回值 )的精确细节(比如,数据 类型和长度)。 因此,除了执行命令和得到一系列返回记录,也可能得到一些由命令提供的附加信息。 对于那些不返回任何记录的命令,如插入新数据或更新数据的 S Q L查询,C o m m a n d对象 也是有用的。 8.2.3 Recordset对象 R e c o r d s e t对象是A D O中使用最为普遍的对象,因为它含有从数据存储中提取的数据集。 我们经常运行不返回数据的命令,比如那些增加或更新数据的命令,但在大多数情况下很有 可能会取得一系列记录。 R e c o r d s e t对象是拥有这些记录的对象。可以更改 (增加、更新和删除)记录集中的记录,上 下移动记录,过滤记录并只显示部分内容等等。 R e c o r d s e t对象也包含F i e l d s集合,F i e l d s集合 中有记录集中每一个字段(列)的F i l e d对象。 无论是在A S P页面中处理数据,还是利用远程数据服务 ( R D S )远程使用数据,R e c o r d s e t对 象是必须处理的对象。 8.2.4 Record对象 ADO 2.5以前的版本在处理结构化数据上是很有效的,比如从数据库中取出记录集,但无 法处理每一行的列 (也就是列数和数据类型 )可能不同的数据。对于 S Q L数据这不是一个问题, 但对于文件和邮件系统, We b服务器和别的诸如此类的数据存储会如何呢?我们把这些数据 看作是半结构化的数据,与记录集相比结构性较差,但与那些常用来代表文本或图像的二进 制数据相比更具有结构性。 通常,半结构化数据的存储采用树状结构来组织,有节点、子节点和文件。例如,设想 一个有文件夹、子文件夹和文件的 We b站点。图8 - 4所示的屏幕图显示了一台机器的 We b站点, 特别是还有一个名为p u b l i c的虚拟目录。 如果一定要在A D O中进行建模,会觉得这非常适合记录集,可能是嵌套的记录集。然而 注意高亮显示的目录,该目录含有不同类型的文件,里面有几个目录、一个 A S P文件、一个 文本文件和一个 W O R D文档。你会很容易地将其映射到一个拥有名称、类型、上次存取时间 等字段的记录集,遗憾的是并不是这样简单。对于访问权限而言,在文件和目录之间就有区 别。对于目录,需要的是能访问目录下的文件;而对于文件,却可能是需要访问其内容。 由于其复杂性,引入了R e c o r d对象。在上面的情况下,存在有一些相同属性的条目的一个 集合,但是每个条目也有独特的属性,因此需要使用别的方法去处理这些数据。把一个集合映 射到一个记录集,一个单独的文件映射成一条记录,相应的文件属性就映射成 F i e l d s集合。 第8章 ADO 基 础计计249 下载
250 ASP3高级编程 Chinapub.com 下载 的入日吗显· oo 2.5 object Model orang wth XM Data 1. Working wth xM Data +12- The Dream of LOA , a2750-Professiond ADo 2.5 图8-4显示了一台机器的web站点的界面 这意味着有了一个含有九行记录的记录集。访问记录集中单独的一行就会得到该文件的 属性(字段),但是提供给我们的仅仅是属性。为了访问文件或目录的内容,需要使用 Record对 象,该对象包含文件或目录的独特属性。习惯于这个概念有一定的困难,但不必担心,在第 11、12章你会看到更多的有关 Record对象的例子 Windows2000初始版本发布以来,只有用于 Internet发布的 OLE DE提供者使用 Record对象。一旦微软 Exchange6.0发布,将成为以类似方法利用记录集和记录提供 对 Exchange信息库访问的 OLE DB提供者。 82.5 Strean对象 Stream对象用于访问节点的内容,比如一个EMai消息,或一个Web页面。利用 Stream对 象可以访问文件或资源的真实内容。因此,结合 Record和 Recordset对象,不仅可以访问Web 服务器上的文件或emai消息,还可以访问相应的内容。这样,就可以创建一个只使用ADO去 访问邮件系统的邮件客户。这也许不会有太多的优点,但意味着可不必了解邮件系统的API或 对象模型,减少了学习上的弯路。 Stream的另一个用途是XML,可以访问一系列作为XML流的数据(结构化或半结 构化)。 Stream对象用来处理二进制数据,所以,可以用来处理BLOB类型的数据,比如数据库中 的图像或大文本数据。 同样,在本书第11、12章中你会看到更多的有关 Stream对象的例子。 82.6集合 ADO对象库中有一些集合,每个集合都有零个或更多个与其关联的对象的拷贝。可以使 用相同的代码结构去遍历这些集合 在 SCript中的语法是 For Each Object In collection Do something with Object
图8-4 显示了一台机器的We b站点的界面 这意味着有了一个含有九行记录的记录集。访问记录集中单独的一行就会得到该文件的 属性(字段),但是提供给我们的仅仅是属性。为了访问文件或目录的内容,需要使用 R e c o r d对 象,该对象包含文件或目录的独特属性。习惯于这个概念有一定的困难,但不必担心,在第 11、1 2章你会看到更多的有关R e c o r d对象的例子。 Windows 2000初始版本发布以来,只有用于 I n t e r n e t发布的OLE DB提供者使用 R e c o r d对象。一旦微软Exchange 6.0发布,将成为以类似方法利用记录集和记录提供 对E x c h a n g e信息库访问的OLE DB提供者。 8.2.5 Stream对象 S t r e a m对象用于访问节点的内容,比如一个 E - M a i l消息,或一个We b页面。利用S t r e a m对 象可以访问文件或资源的真实内容。因此,结合 R e c o r d和R e c o r d s e t对象,不仅可以访问 We b 服务器上的文件或 e m a i l消息,还可以访问相应的内容。这样,就可以创建一个只使用 A D O去 访问邮件系统的邮件客户。这也许不会有太多的优点,但意味着可不必了解邮件系统的 A P I或 对象模型,减少了学习上的弯路。 S t r e a m的另一个用途是X M L,可以访问一系列作为 X M L流的数据(结构化或半结 构化)。 S t r e a m对象用来处理二进制数据,所以,可以用来处理 B L O B类型的数据,比如数据库中 的图像或大文本数据。 同样,在本书第11、1 2章中你会看到更多的有关S t r e a m对象的例子。 8.2.6 集合 A D O对象库中有一些集合,每个集合都有零个或更多个与其关联的对象的拷贝。可以使 用相同的代码结构去遍历这些集合: 在V B S c r i p t中的语法是: 250计计ASP 3 高级编程 下载 Collection
第章AD0基c251 下载 例如,遍历一个 Recordset对象的 fields集: For Each objField In rs Fields Response. Write objField Name&.<BR> 如果选择 JScript,那么可以使用 Enumerator对象 for (ob]Field new Enumerator(rs Fields) lobjField atEnd() objField moveNext()) Response. Write (ob]Field item(). Name +'<BR>') 1. Fields集合 ields集合拥有与记录集或记录关联的 Field对象。对基于结构化数据的记录集,比如SQL 数据,字段相应于数据中的列,并含有列的详细内容,比如名称、数据类型、长度等等。在 以后几章看到大量的关于 Fields集合的例子。 对于半结构化的数据,对象的属性相应于字段。在第12章会看到更多的相关的介绍 2. Parameters集合 Parameters集合仅被 Command对象使用,确定在存储命令中的参数。SQL数据库中的存 储过程频繁地使用参数,并允许数据传入和传出预先定义的SQL语句。如果拥有向ADO返回 信息的参数,则会十分有用,因为这样从存储过程中返回的就不只是一个记录集。例如,考 虑一个更新多个表然后返回一个记录集的复杂存储过程,可以用一个输出参数显示更新了多 少条记录 另一个使用参数的理由是性能问题,特别是在仅仅需要从存储过程返回单个值的时候。 在这种情况下,没有创建记录集的必要,只需要保存一个值即可,因而不需要返回记录集, 而返回输出参数的值是更为有效的方法。 在第9章会看到有关 Parameters集合的详细介绍 3. Errors集合 Errors集合包含因运行命令而引起的上一次ADO或 OLE DB提供者错误的详细内容,只能 被 Connection对象访问。可能会觉得这是个限制,因为不必显式定义 Connection对象,但可以 过 Command、 Recordset和 Record对象的 Active Connection属性访问隐含的 Connection对象。 For Each objError In reConnection Erro 在本章后面,将详细讨论 Errors集合。 Connection 4. Properties集合 为了避免混乱, Properties集合没有在前 面的对象模型图上加以显示。它与对象模型的 Properties 关系显示在图8-5中。 I command Record Properties集合存在的原因是因为ADO是 用来处理许多不同的数据存储,都有不同的特 征。将属性( Property)组成一个集合,可以使 Recordset 能够动态地根据不同的数据提供者而随时改 变。例如,Jet的 OLE DB提供者允许访问Jet特 图8-5 Property与对象之间的关系
例如,遍历一个R e c o r d s e t对象的F i e l d s集: 如果选择J S c r i p t,那么可以使用E n u m e r a t o r对象: 1. Fields集合 F i e l d s集合拥有与记录集或记录关联的 F i e l d对象。对基于结构化数据的记录集,比如 S Q L 数据,字段相应于数据中的列,并含有列的详细内容,比如名称、数据类型、长度等等。在 以后几章看到大量的关于F i e l d s集合的例子。 对于半结构化的数据,对象的属性相应于字段。在第 1 2章会看到更多的相关的介绍。 2. Parameters集合 P a r a m e t e r s集合仅被Command 对象使用,确定在存储命令中的参数。 S Q L数据库中的存 储过程频繁地使用参数,并允许数据传入和传出预先定义的 S Q L语句。如果拥有向 A D O返回 信息的参数,则会十分有用,因为这样从存储过程中返回的就不只是一个记录集。例如,考 虑一个更新多个表然后返回一个记录集的复杂存储过程,可以用一个输出参数显示更新了多 少条记录。 另一个使用参数的理由是性能问题,特别是在仅仅需要从存储过程返回单个值的时候。 在这种情况下,没有创建记录集的必要,只需要保存一个值即可,因而不需要返回记录集, 而返回输出参数的值是更为有效的方法。 在第9章会看到有关P a r a m e t e r s集合的详细介绍。 3. Errors集合 E r r o r s集合包含因运行命令而引起的上一次 A D O或OLE DB提供者错误的详细内容,只能 被C o n n e c t i o n对象访问。可能会觉得这是个限制,因为不必显式定义 C o n n e c t i o n对象,但可以 通过C o m m a n d、R e c o r d s e t和R e c o r d对象的A c t i v e C o n n e c t i o n属性访问隐含的C o n n e c t i o n对象。 例如: 在本章后面,将详细讨论E r r o r s集合。 4. Properties集合 为了避免混乱, P r o p e r t i e s集合没有在前 面的对象模型图上加以显示。它与对象模型的 关系显示在图8 - 5中。 P r o p e r t i e s集合存在的原因是因为 A D O是 用来处理许多不同的数据存储,都有不同的特 征。将属性 ( P r o p e r t y )组成一个集合,可以使 之能够动态地根据不同的数据提供者而随时改 变。例如,J e t的OLE DB提供者允许访问J e t特 第8章 ADO 基 础计计251 下载 图8-5 Property 与对象之间的关系
252 ASP3高级编程 Chinapub.com 下载 殊的安全属性: et coni ver. CreateObject("ADODB Connection") onDB op =Win conDB. Properties(Jet OLEDB: Database Password")-.LetMeIn 其他的提供者没有这个属性,因此把它加到 Connection对象中作为一个静态属性是不明智 的。ADO根据所使用的 OLE DB提供者,会用提供者缺省值填充属性集合。 虽然这里有关于 Properties集合的使用说明,但在本书中不准备详细叙述 Properties集合。要获得更多的关于该集合的介绍,请参阅《 Professional ado2.5 Programming》或《ADO25 Programmings Reference》,两者都由Wrox出版 827ADO常数 当使用ADO时,会发现有许多预先定义的用于众多选项的常数,比如定义光标类型和锁 类型的常数。使用像 Visual basic或Ⅴ Visual c++这样的语言,一旦引用了ADO类型库,自然会 用到这些常数。在ASP中情况不同,有两种选择 引用常数的第一种方法是把它们包含进ASP文件: 可以将包含文件拷入本地目录,或者从安装目录引用它,其缺省路径为C:\ Program Files\Common Files\System \ado(以上文件包含用于Ⅴ SCript的ADO常数——对于 JScript,应 该使用 adojavas.Inc)。使用这个方法的一点不足是会使ASP页面变得过大,因为包含了全部的 常数,而其中许多是不需要使用的 可以创建自己的只含有所需要的常数的包含文件,但越来越多地使用ADO的功 能时,很可能会发现需要不断地编辑、维护这个文件。 个比较好的解决的方法是创建一个对类型库的引用,这种方法不需要将常数包含进 ASP文件而直接可以引用常数 <1--METADATA TYPE='typelibFILE-'C: \Program Files\common Files\system do\sado15.a11·--> 不要怀疑这个DLL的名字 mado l5d这是一个正确的名字,包含最新版本的 ADO。 可以在需要的地方把这个 METADATA语句包含进每一个ASP文件,或者放入 global.asa文 件,这样应用程序中的每个Web页面都可以引用这些常数 8.3连接到数据存储 如果需要访问一个数据存储,应该创建一个到数据存储的连接。前面已经提到过:可以 显式地创建一个 Connection对象,或者让ADO隐含地创建一个连接。对于任何一种方式,都 必须知道数据存储的详细内容 虽然用于连接的实际细节不尽相同,但对于所有类型的数据存储,其连接的实际方法是 相同的。这并不令人惊奇,因为不同的提供者需要不同类型的信息。在允许用户访问数据存
殊的安全属性: 其他的提供者没有这个属性,因此把它加到 C o n n e c t i o n对象中作为一个静态属性是不明智 的。A D O根据所使用的OLE DB提供者,会用提供者缺省值填充属性集合。 虽然这里有关于 P r o p e r t i e s集合的使用说明,但在本书中不准备详细叙述 P r o p e r t i e s集合。要获得更多的关于该集合的介绍,请参阅 《Professional ADO 2.5 P r o g r a m m i n g》或《ADO 2.5 Programming's Reference》,两者都由Wr o x出版。 8.2.7 ADO常数 当使用A D O时,会发现有许多预先定义的用于众多选项的常数,比如定义光标类型和锁 类型的常数。使用像 Visual Basic或Visual C++这样的语言,一旦引用了 A D O类型库,自然会 用到这些常数。在A S P中情况不同,有两种选择。 引用常数的第一种方法是把它们包含进 A S P文件: 可以将包含文件拷入本地目录,或者从安装目录引用它,其缺省路径为 C:\ P r o g r a m Files\Common Files\System\ado(以上文件包含用于 V B S c r i p t的A D O常数—对于J S c r i p t,应 该使用a d o j a v a s . I n c )。使用这个方法的一点不足是会使 A S P页面变得过大,因为包含了全部的 常数,而其中许多是不需要使用的。 可以创建自己的只含有所需要的常数的包含文件,但越来越多地使用 A D O的功 能时,很可能会发现需要不断地编辑、维护这个文件。 一个比较好的解决的方法是创建一个对类型库的引用,这种方法不需要将常数包含进 A S P文件而直接可以引用常数: 不要怀疑这个 D L L的名字m s a d o 1 5 . d l l,这是一个正确的名字,包含最新版本的 A D O。 可以在需要的地方把这个 M E TA D ATA语句包含进每一个A S P文件,或者放入g l o b a l . a s a文 件,这样应用程序中的每个 We b页面都可以引用这些常数。 8.3 连接到数据存储 如果需要访问一个数据存储,应该创建一个到数据存储的连接。前面已经提到过:可以 显式地创建一个 C o n n e c t i o n对象,或者让A D O隐含地创建一个连接。对于任何一种方式,都 必须知道数据存储的详细内容。 虽然用于连接的实际细节不尽相同,但对于所有类型的数据存储,其连接的实际方法是 相同的。这并不令人惊奇,因为不同的提供者需要不同类型的信息。在允许用户访问数据存 252计计ASP 3 高级编程 下载
第章AD0基c253 下载 储之前,一些提供者需要用户的证书,而别的提供者却接受默认的安全证书 连接到数据源有好几种方法: ·连接字符串。在字符串中放入连接的细节,或在打开数据存储时,直接将连接细节加入 到命令中。这种方法的优点是连接细节将保留在ASP页面中。不足之处,如果你有较多 的页面,在改变了连接细节时,将陷于繁重的维护工作当中。解决的方法是创建一个包 含连接细节的字符串变量,并放进一个ASP包含文件,这样的话仅仅有一个连接字符串 的实例,但能保持与其他的ASP页面相符。另一个常用的技术就是将应用程序中的连接 字符串存储到状态变量中,这样可以被应用程序中的所有页面使用。 ·数据链接文件。这是一个含有连接细节的文件(扩展名为udl)。优点是对于任何数量的 ASP页面只需要一个数据链接文件。要创建一个数据链接文件,只需创建一个新的文本 文件,并重新命名(要确保 Windows资源管理器显示文件扩展名)。一旦重新命名了该文 件,就可以打开它(双击)以显示 Data Link Properties对话框。以前版本的ADO允许从 Windows资源管理器的New菜单建立数据链接文件。我们将在本章稍后看到有关数据链 接文件的内容。 ODBC数据源,或DSN。有点类似于数据链接文件,但只适用于ODBC数据源。它们集 中起来用于ASP页面,数据源必须是系统数据源。ODBC数据源从ODBC数据源管理器 ( ODBC Data Source Administrator)中创建,这个工具可在 Administrative tools文件夹中 找到 这三种方法无论那一种都可以使用,使用那一种只是一种偏爱而已。直接的连接字符串 可能速度快一些,因为提供所有的连接细节。数据链接文件需要从文件中读出连接细节 ODBC数据源需要从注册表中读取连接细节。当然,速度的差异是很小的,每种方法各有优 3.1连接字符串 连接字符串依赖于提供者,因为每个数据提供者可能需要不同的细节 值得注意的重要一点是,ODBC的 OLE DE提供者是缺省的,所以,如果不使用 Provide=部分,系统将自动地使用ODBC。 下面为不同的提供者列举了连接字符串的例子,在本书的后面将会看到更多的例子 1.微软 Access 如果使用ODBC,而没有DSN: Driver=(Microsoft Access Driver ( mab)): DBQ=C: \wrox\database name. mdb 对于本地的 OLE DE提供者 Provider=Microsoft Jet OLEDB, 4.0: Data Source= C: \wrox\ database name. mdb 上面的例子说明了 Access数据库存放于C: \wrox目录下。虽然读者可能会尝试将数据库作 为web文件存放于相同的目录下,但不要这样做,否则任何人都可以下载整个数据库文件。 将数据库存放于Web目录外永远是明智的,没有人可以从外面访问该文件 2.微软 SQL Server 对于微软 SQL Server,使用针对ODBC的提供者:
储之前,一些提供者需要用户的证书,而别的提供者却接受默认的安全证书。 连接到数据源有好几种方法: • 连接字符串。在字符串中放入连接的细节,或在打开数据存储时,直接将连接细节加入 到命令中。这种方法的优点是连接细节将保留在 A S P页面中。不足之处,如果你有较多 的页面,在改变了连接细节时,将陷于繁重的维护工作当中。解决的方法是创建一个包 含连接细节的字符串变量,并放进一个 A S P包含文件,这样的话仅仅有一个连接字符串 的实例,但能保持与其他的 A S P页面相符。另一个常用的技术就是将应用程序中的连接 字符串存储到状态变量中,这样可以被应用程序中的所有页面使用。 • 数据链接文件。这是一个含有连接细节的文件 (扩展名为. u d l )。优点是对于任何数量的 A S P页面只需要一个数据链接文件。要创建一个数据链接文件,只需创建一个新的文本 文件,并重新命名 (要确保Wi n d o w s资源管理器显示文件扩展名 )。一旦重新命名了该文 件,就可以打开它 (双击)以显示 Data Link Properties对话框。以前版本的 A D O允许从 Wi n d o w s资源管理器的N e w菜单建立数据链接文件。我们将在本章稍后看到有关数据链 接文件的内容。 • O D B C数据源,或D S N。有点类似于数据链接文件,但只适用于 O D B C数据源。它们集 中起来用于A S P页面,数据源必须是系统数据源。 O D B C数据源从O D B C数据源管理器 (ODBC Data Source Administrator)中创建,这个工具可在Administrative To o l s文件夹中 找到。 这三种方法无论那一种都可以使用,使用那一种只是一种偏爱而已。直接的连接字符串 可能速度快一些,因为提供所有的连接细节。数据链接文件需要从文件中读出连接细节, O D B C数据源需要从注册表中读取连接细节。当然,速度的差异是很小的,每种方法各有优 缺点。 8.3.1 连接字符串 连接字符串依赖于提供者,因为每个数据提供者可能需要不同的细节。 值得注意的重要一点是, O D B C的OLE DB提供者是缺省的,所以,如果不使用 Provide = 部分,系统将自动地使用 O D B C。 下面为不同的提供者列举了连接字符串的例子,在本书的后面将会看到更多的例子。 1. 微软A c c e s s 如果使用O D B C,而没有D S N: 对于本地的OLE DB提供者: 上面的例子说明了 A c c e s s数据库存放于C : \ w r o x目录下。虽然读者可能会尝试将数据库作 为We b文件存放于相同的目录下,但不要这样做,否则任何人都可以下载整个数据库文件。 将数据库存放于We b目录外永远是明智的,没有人可以从外面访问该文件。 2. 微软SQL Server 对于微软SQL Server,使用针对O D B C的提供者: 第8章 ADO 基 础计计253 下载