\r\n\r\n\r\n \r\n\r\n\r\n深入探索了类、接口、属性和方法。讲解了数据结构,演示了如何用ADO.NET来解决具体的数据访问问题。重点讨论了ADO.NET如何有效地平衡'功能的泛化'和'执行效率',以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问API(包括OLE \r\n\r\nDB,ADO,ODBC和JDBC)的程序员,提供了帮助其迁移到ADO.NET许多易用的参考。\r\n\r\n\r\n本书由资深数据库教师编写,全面介绍了ADO.NET。书中深入剖析了ADO.NET的本质,探索了类、接口、属性和方法的工作原理,同时还为其他数据访问API(包括OLEDB,ADO,ODBC和JDBC)的程序员,提供了有价值的参考材料。本书适合具有一定数据库基础的开发人员阅读,也可用作数据库中高级课程或培训班配套教材。 \r\n
\r\n
第1章 数据:模型. 应用程序和API \r\n\r\n 1. 1 信息. 数据建模和数据库 \r\n\r\n 1. 2 数据库和API基础 \r\n\r\n 1. 3 关系模型 \r\n\r\n 1. 3. 1 关系设计规则 \r\n\r\n 1. 3. 2 关系模型的优点 \r\n\r\n 1. 3. 3 ADO.NET对关系模型的支持 \r\n\r\n 1. 4 层次结构. 对象和混合 \r\n\r\n 1. 4. 1 现代的非关系数据 \r\n\r\n 1. 4. 2 多维数据 \r\n\r\n 1. 4. 3 非关系数据和ADO.NET \r\n\r\n 1. 4. 4 XML和信息集 \r\n\r\n 1. 4. 5 XML. 数据库和统一数据表示 \r\n\r\n 1. 5 以数据的中心的应用程序模型 \r\n\r\n 1. 6 数据访问API的发展历程 \r\n\r\n 1. 7 小结 \r\n\r\n \r\n\r\n 第2章 ADO. NET基础 \r\n\r\n 2. 1 数据访问和. NET体系结构 \r\n\r\n 2. 2 两种数据访问模式 \r\n\r\n 2. 3 连接模式 \r\n\r\n 2. 3. 1 OleDb和SqlClient数据提供程序 \r\n\r\n 2. 3. 2 使用ADO. NET数据提供程序编写泛型数据访问代码 \r\n\r\n 2. 3. 3 数据提供程序模型中的游标 \r\n\r\n 2. 4 断开模式和DataSet \r\n\r\n 2. 5 . NET中的XML API \r\n\r\n 2. 5. 1 流式XML \r\n\r\n 2. 5. 2 XML架构 \r\n\r\n 2. 5. 3 XmlDocument, XPath和XPathNavigator \r\n\r\n 2. 5. 4 XML和数据提供程序的混合 \r\n\r\n 2. 6 托管数据类的布局 \r\n\r\n 2. 7 小结 \r\n\r\n \r\n\r\n 第3章 连接模型:流式数据访问 \r\n\r\n 3. 1 . NET数据提供程序和连接模型 \r\n\r\n 3. 2 连接类 \r\n\r\n 3. 3 连接池 \r\n\r\n 3. 4 元数据方法 \r\n\r\n 3. 5 Command类 \r\n\r\n 3. 6 使用参数 \r\n\r\n 3. 7 命令的准备. 取消. 超时和清除 \r\n\r\n 3. 8 通过DataReader进行流式数据传输 \r\n\r\n 3. 9 通过IDataRecord读取列值 \r\n\r\n 3. 10 错误处理 \r\n\r\n 3. 11 使用事务处理 \r\n\r\n 3. 11. 1 分布式事务处理 \r\n\r\n 3. 11. 2 连接池的工作原理 \r\n\r\n 3. 11. 3 声明性事务处理的工作原理 \r\n\r\n 3. 12 Permission类 \r\n\r\n 3. 13 小结 \r\n\r\n \r\n\r\n 第4章 DataSet类:关系数据的集合 \r\n\r\n 4. 1 DataSet \r\n\r\n 4. 1. 1 DataSet作为驻留内存的数据库 \r\n\r\n 4. 1. 2 DataSet的用途 \r\n\r\n 4. 2 DataSet对象模型 \r\n\r\n 4. 2. 1 DataColumn, DataRow和Data Table \r\n\r\n 4. 2. 2 Data Table及其用法 \r\n\r\n 4. 2. 3 DataRow \r\n\r\n 4. 2. 4 键. 关系和约束 \r\n\r\n 4. 2. 5 通过关系来导航:Select和Find \r\n\r\n 4. 2. 6 行的添加. 获取. 更改和删除 \r\n\r\n 4. 2. 7 合并更改 \r\n\r\n 4. 2. 8 合并DataSet \r\n\r\n 4. 2. 9 DataRow的状态和版本 \r\n\r\n 4. 2. 10 规则和关系 \r\n\r\n 4. 2. 11 错误处理 \r\n\r\n 4. 2. 12 事件 \r\n\r\n 4. 2. 13 DataSet和非关系类型 \r\n\r\n 4. 3 定义信息架构 \r\n\r\n 4. 4 小结 \r\n\r\n \r\n\r\n 第5章 DataAdapter:数据库和DataSet的同步 \r\n\r\n 5. 1 乐观并发性 \r\n\r\n 5. 2 DataAdapter类 \r\n\r\n 5. 3 从托管提供程序中填充DataSet \r\n\r\n 5. 3. 1 在Fill中使用架构和映射信息 \r\n\r\n 5. 3. 2 执行DataAdapter. Fill期间的错误处理 \r\n\r\n 5. 4 DataAdapter. Fill的工作原理 \r\n\r\n 5. 5 OleDbDataAdapter中的ADO集成 \r\n\r\n 5. 6 通过DataAdapter更新数据库 \r\n\r\n 5. 6. 1 CommandBuilder类 \r\n\r\n 5. 6. 2 直接编写更新逻辑 \r\n\r\n 5. 7 Update的工作原理 \r\n\r\n 5. 8 DataSet事件模型 \r\n\r\n 5. 9 编写常规自定义命令 \r\n\r\n 5. 9. 1 ADOX CommandBuilder \r\n\r\n 5. 9. 2 构造批处理更新命令 \r\n\r\n 5. 10 再论DataSet和非关系数据类型 \r\n\r\n 5. 11 应该使用DataSet还是DataReader \r\n\r\n 5. 12 小结 \r\n\r\n \r\n\r\n 第6章 数据绑定:ADO. NET和GUI \r\n\r\n 6. 1 Windows窗体和Web窗体 \r\n\r\n 6. 2 数据表示模式 \r\n\r\n 6. 3 使用数据绑定控件 \r\n\r\n 6. 3. 1 Web窗体数据绑定类型 \r\n\r\n 6. 3. 2 数据绑定控件类型解析 \r\n\r\n 6. 3. 3 同DataReader绑定 \r\n\r\n 6. 4 用DataSet进行数据绑定 \r\n\r\n 6. 5 Data View和通用转换 \r\n\r\n 6. 6 表和列映射 \r\n\r\n 6. 7 可编辑的列表控件:DataList和DataGrid \r\n\r\n 6. 7. 1 DataList \r\n\r\n 6. 7. 2 DataGrid \r\n\r\n 6. 8 非关系数据和Data View \r\n\r\n 6. 9 与Visual Studio的集成 \r\n\r\n 6. 10 控件和数据窗体 \r\n\r\n 6. 1l 小结 \r\n\r\n \r\n\r\n 第7章 XML和数据访问的集成 \r\n\r\n 7. 1 XML和传统数据访问 \r\n\r\n 7. 2 XML和ADO. NET \r\n\r\n 7. 2. 1 定义DataSet的架构 \r\n\r\n 7. 2. 2 优化DataSet的XML架构 \r\n\r\n 7. 2. 3 将XML读入DataSet \r\n\r\n 7. 2. 4 从DataSet写入XML架构 \r\n\r\n 7. 2. 5 Microsoft特有的批注 \r\n\r\n 7. 2. 6 从DataSet写入XML数据 \r\n\r\n 7. 3 序列化. 封送和DataSet \r\n\r\n 7. 4 类型化的DataSet \r\n\r\n 7. 5 XmlDataDocument类 \r\n\r\n 7. 5. 1 XmlDataDocument和DataSet \r\n\r\n 7. 5. 2 XmlDataDocument和DataDocumentXPathNavigator \r\n\r\n 7. 6 数据库和XML的重要意义 \r\n\r\n 7. 6. 1 XML作为一种特定类型 \r\n\r\n 7. 6. 2 文档合成与分解 \r\n\r\n 7. 7 SQL Server. XML和托管数据访问 \r\n\r\n 7. 7. 1 FOR XML关键字 \r\n\r\n 7. 7. 2 OpenXML \r\n\r\n 7. 7. 3 SQLOLEDB提供程序 \r\n\r\n 7. 7. 4 SqlXml托管类 \r\n\r\n 7. 7. 5 SQLXML Web应用程序 \r\n\r\n 7. 7. 6 updategram \r\n\r\n 7. 7. 7 SQL XML OLEDB提供程序中的FOR XML \r\n\r\n 7. 7. 8 批量加载 \r\n\r\n 7. 7. 9 未来的支持 \r\n\r\n 7. 8 使用SQLXML和. NET \r\n\r\n 7. 9 小结 \r\n\r\n \r\n\r\n 第8章 提供程序:ADO. NET和数据提供程序 \r\n\r\n 8. 1 如何选择 \r\n\r\n 8. 2 保留OLE DB:OLE DB概念总结 \r\n\r\n 8. 3 保留OLE DB:与OleDb数据提供程序交互 \r\n\r\n 8. 3. 1 主要的共型和类型映射 \r\n\r\n 8. 3. 2 访问程序 \r\n\r\n 8. 3. 3 执行命令. 返回结果和使用OpenRowset \r\n\r\n 8. 3. 4 Command的最终格式和行为 \r\n\r\n 8. 3. 5 Command Dialect \r\n\r\n 8. 3. 6 层次化数据 \r\n\r\n 8. 3. 7 从Rowset更新 \r\n\r\n 8. 3. 8 错误 \r\n\r\n 8. 3. 9 不支持的功能 \r\n\r\n 8. 3. 10 支持和不支持的提供程序 \r\n\r\n 8. 4 编写数据提供程序 \r\n\r\n 8. 5 实现Connection类 \r\n\r\n 8. 5. 1 规格 \r\n\r\n 8. 5. 2 实现 \r\n\r\n 8. 5. 3 特殊化 \r\n\r\n 8. 6 实现Command类 \r\n\r\n 8. 6. 1 规格 \r\n\r\n 8. 6. 2 实现 \r\n\r\n 8. 6. 3 特殊化 \r\n\r\n 8. 7 实现DataReader类 \r\n\r\n 8. 7. 1 规格 \r\n\r\n 8. 7. 2 实现 \r\n\r\n 8. 7. 3 特殊化 \r\n\r\n 8. 8 实现DataAdapter类 \r\n\r\n 8. 8. 1 规格 \r\n\r\n 8. 8. 2 实现 \r\n\r\n 8. 8. 3 特殊化 \r\n\r\n 8. 9 添加增强功能 \r\n\r\n 8. 10 实现XML Infoset提供程序 \r\n\r\n 8. 11 实现XmlReader \r\n\r\n 8. 12 实现XPathNavigator \r\n\r\n 8. 13 其他实现方案:总结 \r\n\r\n 8. 14 论证大一统访问模型的可行性 \r\n\r\n 8. 15 小结 \r\n\r\n \r\n\r\n 第9章 消费者的ADO. NET迁移路径 \r\n\r\n 9. 1 ADO. NET迁移路径 \r\n\r\n 9. 2 面向OLE DB程序员的ADO. NET \r\n\r\n 9. 2. 1 cotype等价物 \r\n\r\n 9. 2. 2 数据提供程序的透明性 \r\n\r\n 9. 2. 3 使用提供程序特有的功能 \r\n\r\n 9. 2. 4 错误处理 \r\n\r\n 9. 2. 5 系统提供的服务 \r\n\r\n 9. 2. 6 系统提供的组件 \r\n\r\n 9. 2. 7 服务提供程序 \r\n\r\n 9. 2. 8 封送 \r\n\r\n 9. 3 ADO概述 \r\n\r\n 9. 4 面向ADO程序员的ADO. NET \r\n\r\n 9. 5 ADO Connection. Command和事务处理 \r\n\r\n 9. 5. 1 连接和连接字符串 \r\n\r\n 9. 5. 2 使用事务处理 \r\n\r\n 9. 5. 3 命令和Command行为 \r\n\r\n 9. 5. 4 层次化数据 \r\n\r\n 9. 5. 5 异步操作 \r\n\r\n 9. 5. 6 属性 \r\n\r\n 9. 6 ADO. NET与ADO断开模型的比较 \r\n\r\n 9. 6. 1 类的等价物 \r\n\r\n 9. 6. 2 导航 \r\n\r\n 9. 6. 3 ADO.NET中的GetRows有何变化 \r\n\r\n 9. 6. 4 更新 \r\n\r\n 9. 6. 5 创建更新语句 \r\n\r\n 9. 6. 6 批处理更新 \r\n\r\n 9. 6. 7 ADO.NET的DataSet扩展 \r\n\r\n 9. 6. 8 列和表的命名 \r\n\r\n 9. 6. 9 排序和筛选 \r\n\r\n 9. 7 ADO DB的互操作性 \r\n\r\n 9. 8 面向ODBC程序员的ADO.NET \r\n\r\n 9. 8. 1 句柄和环境 \r\n\r\n 9. 8. 2 命令 \r\n\r\n 9. 8. 3 获取数据 \r\n\r\n 9. 8. 4 元数据和架构信息 \r\n\r\n 9. 8. 5 错误 \r\n\r\n 9. 9 面向JDBC程序员的ADO. NET \r\n\r\n 9. 9. 1 泛化代码 \r\n\r\n 9. 9. 2 提供程序的类型 \r\n\r\n 9. 9. 3 连接池 \r\n\r\n 9. 9. 4 非关系数据类型 \r\n\r\n 9. 9. 5 对象数据库 \r\n\r\n 9. 9. 6 其他SQL-99扩展 \r\n\r\n 9. 9. 7 元数据 \r\n\r\n 9. 9. 8 事务处理 \r\n\r\n 9. 9. 9 命令和行为 \r\n\r\n 9. 9. 10 执行查询和返回结果 \r\n\r\n 9. 9. 11 服务器游标 \r\n\r\n 9. 9. 12 错误 \r\n\r\n 9. 10 ADO. NET JDBC程序员和断开模型 \r\n\r\n 9. 11 SQL/J Part 0和类型化DataSet \r\n\r\n 9. 12 小结 \r\n\r\n \r\n\r\n 第10章 ADO. NET和各种数据类型 \r\n\r\n 10. 1 数据访问的发展历程 \r\n\r\n 10. 2 ADO. NET和基于服务器及文件的RDBMS \r\n\r\n 10. 3 ADO. NET和同种层次结构数据及ORDBMS \r\n\r\n 10. 4 ADO. NET和网络数据:对象图. ODBMS与网络DBMS \r\n\r\n 10. 5 ADO. NET和结构化文件. 多维数据及ORDBMS \r\n\r\n 10. 6 ADO. NET平面文件和半结构化文件 \r\n\r\n 10. 7 小结 \r\n\r\n \r\n\r\n 附录A 数据类型和类型映射 \r\n\r\n A.1 Db Type枚举 \r\n\r\n A.2 将SQL Server数据类型映射到SqlType及SqlDbType \r\n\r\n A.3 将OLE DB DBTYPE映射到. NET数据类型 \r\n\r\n A.4 ODBC类型映射 \r\n\r\n A.5 Parameter. DbType \r\n\r\n 附录B 表达式的语法 \r\n\r\n B. 1 用户自定义值 \r\n\r\n B. 2 运算符 \r\n\r\n B. 3 字符串运算符 \r\n\r\n B. 4 通配符 \r\n\r\n B. 5 父/子关系引用 \r\n\r\n B. 6 聚合 \r\n\r\n B. 7 函数 \r\n\r\n 附录C 架构推断规则 \r\n\r\n C.1 排除信息 \r\n\r\n C.2 推断过程总结 \r\n\r\n C.3 表 \r\n\r\n C.4 有属性的元素 \r\n\r\n C.5 有子元素的元素 \r\n\r\n C.6 重复元素 \r\n\r\n C.7 列 \r\n\r\n C.8 属性 \r\n\r\n C.9 没有属性或子元素的元素 \r\n\r\n C.10 关系 \r\n\r\n C.11 元素文本 \r\n\r\n C.12 限制 \r\n\r\n 参考文献 \r\n
\r\n
由于工作需要, 我对ADO. NET技术比较关注, 同时也注意到国内ADO. NET方面的书乏善可陈, 身边不少朋友表示自己迫切需要一本非常权威的ADO. NET宝典. 好的ADO. NET书籍应该具备什么样的条件呢?在我看来, 它至少有以下几点:第一, 要全面而深入地剖析ADO. NET, 不"放过"ADO. NET的每一个重要对象, 第二, 要对古往今来(有点夸张吧)的数据访问技术进行横向对比, 让读者一眼就明白应该如何选择, 第三, 要知道读者需要什么, 哪些应该重点强调, 哪些应该点到为止, 第四, 要考虑到原有数据访问技术到ADO. NET的过渡, 第五, 向读者传达的信息必须是可靠的. 经过证明的.
这几点, 《ADO.NET本质论》都具备. 首先, 全书的开头和结尾(第1章和第10章)介绍了与数据有关的主题:模型. 应用程序和API, 第2~7章则深入剖析了ADO. NET的类. 接口以及方法的工作原理(要想发挥ADO. NET的潜力, 了解其幕后的工作原理是关键), 其次, 书中对数据访问技术的过去和未来侃侃而谈, 对ADO. NET. ADO. OLE DB以及其他数据访问API进行了对比, 让读者一目了然, 第三, 本书的重点在于讲解工作原理, 教您从更深的层次去思考, 而不是教您一些机械. 刻板的做法, 第四, 分别为OLE DB程序员. ADO程序员. ODBC程序员. JDBC程序员提供了迁移到ADO. NET的路径, 这一部分内容包含在第9章, 第五, 从前言以及译者对书中示范代码的编译可以看出, 本书的确为作者深思熟虑之后所写的, 是一本经得起考验的书.
本书作者Bob Beauchemin从事信息处理已有20多年. 他阅历丰富, 不仅从事过软件开发. 系统管理, 还是一个活跃的撰稿人, 在很多技术期刊和杂志发表过一些具有影n向力的文章. 我在一些专业类网站也时常看到他撰写的文章, 他对数据库以及软件开发的精通程度令人叹服, 简直就是一部"存储量"惊人的"参考书"! Bob学识渊博, 博文广识, 非常精通各种数据库. 作为一个痴迷于技术的人, 他常常不惜牺牲自己的业余时间, 帮助他人排忧解难, 先后帮助Transportation COM+和Essential. NET的作者解决他们写书过程中碰到的难题. 这一点, 我深有体会, 在与Bob沟通的过程中, 他总是来信必复, 并把其中涉及到的前因后果分析得头头是道, 使人茅塞顿开.
翻译本书虽然失去了部分休息时间, 但通过跟Bob以及其他ADO. NET爱好者的沟通, 不但使我受益匪浅, 还使我进一步巩固了自己的数据库实践知识, 有机会重新调整自己原有的数据库知识体系.
有的读者曾抱怨本书没有提供完整的示范代码, 没错, 书中大部分代码只是片段, 但它们都能通过编译. 如果真的需要完整的示范代码, 也可径直前往本书配套网站下载, 速度非常快. 为方便读者, 我已尽可能修正了原书中已有的错误(已经过作者确认), 并将其合并到译文中. 如果您在阅读过程中, 还发现有"漏网之鱼", 欢迎您与作者本人或我联系. 最后, 希望本书成为您的良师益友, 为您提供好的指引.
周靖于北京
Bob Beauchemin, DevelopMentor的高级专职讲师, 20多年的计算机从业历史, 主讲数据访问课程并担任课程教材编委会成员. 还是ADO.NET. OLE DB. ADO. SQL Server应用程序开发以及Java数据访问的课件作者. 他为许多客户设计和实现了数据驱动的网站以及传统的数据访问应用程序.
本书将讨论ADO. NET, 这是一种新的. 基于提供程序模型(Provider Model)的数据访问库, 它是Microsoft. NET战略的一个组成部分. 但本书同时还将讨论数据--在什么地方存储, 以及如何检索. 更新及索引数据. 由于要讲述数据管理的细节, 所以本书的覆盖面有点儿大, 不会只是简单地罗列所有类. 接口. 属性以及方法在一个库中的用法. 您必须仔细研究准备用这个库来解决的问题, 确定要使用什么"应用程序编程接口"(API)或者使用API的哪一部分.
虽然商业问题都可划分为特定的. 重复出现的模式, 但不可能有一成不变的规则集成了像菜谱那样的"傻瓜"方案. 涉及数据访问. 表示和交换时, 这一问题尤为突出. 今天为了追求终极速度而采用原生汇编语言来编程, 明天就会成为维护时的噩梦. 对某个用户来说, 一种完美的工作模式在一组用户中却无法施展. 适用于一个小型工作组的模式在应用于整个企业时, 却显得困难重重. 虽然本书确实为一些泛化的问题提供了解决方案, 但肯定没有为您提供任何C&P(拷贝和粘贴)方案.
泛化和专用编程模型
不久以前, 我的观念一直是坚持使用厂商专用的. 屡经考验的编程接口, 因为它们通常
总是最快的. 但是, 在我的职业生涯中, 必须经常进行应用程序的转换, 因为一个企业可能
决定改变硬件类型或者数据库. 在任何有悠久历史的公司中, 就像时装的换季那样, 硬件和
数据库的改换是常有的事.
目睹一家公司的网站准备从厂商专用数据库API转换成开放数据库连接(OpenDatabase Connectivity, ODBC, 一种更抽象的API)的时候, 我的观念第一次发生了变化. 这个工作让我体会到了一个"抽象的. 提供程序样式的接口"的巨大好处. 对于许多公司来说, 实际选择的数据库要取决于公司其他部门的意向, 这不受我们项目的控制. 我的项目领导人当时决定选择ODBC, 而不是选择原生API. 事实很快便证明了这个决定是正确的. 新的应用程序很快就写好了, 数据库最终也生成了. 项目按期完成, 项目领导人正好赶得上周五下午的会议. 周一早上, 我就得到通知, 他们最终选用的数据库发生了改变. 幸好, 因为我们使用的是ODBC(同时因为这两种数据库都有ODBC驱动程序), 所以我们只需生成新数据库, 对程序进行少量修改(因为两者的SQL格式有细微差别), 重新测试程序, 就完成了应用程序的转换. 我们太幸运了.
基于提供程序的数据访问API必须平衡两方面的问题:抽象出泛化的功能, 同时为厂商提供足够大的自由发挥的空间, 确保API不会成为一个难以使用. 性能极差的怪物. ADO. NET在后一个方面做得很好:SQL Server专用的数据提供程序(称为SqlClient)证明Microsoft的厂商专用扩展做得非常出色. 另外, 将来问世的数据提供程序还将证明Microsoft的更多过人之处.
技术轮回与革新
我从事计算机信息处理工作已有多年历史. 接受现在这份工作(在DevelopMentor)的面试时, 他们问我:"您的年纪逐渐增大, 编程语言. 设计模式和应用程序编程接口又不断发生变化, 您有没有觉得掌握新技术会越来越困难?"我微笑着回答说:"这实际会变得更容易". 虽然计算工业经历了几代"新思维"的转变, 但我发现被抽象的"问题域"本身却没有改变. 每次进行抽象时, 抽象本身的差异通常都不大. 除此之外, 抽象有时完全就是一种轮回, 今天的"新思维", 说不定就是新瓶里面装的旧酒.
例如, 我对数据访问和数据库管理系统产品的结构一直抱有浓厚的兴趣. 我以前将文件用作数据库(或至少算是数据存储), 使用过层次化数据库, 使用过CODASYL数据库(由Conference on Data Systems Languages标准化, CDSL是美国国防部下属的一个组织, 主要任务是发展程序语言, 现在已经不复存在. --译者注). 关系数据库. 对象数据库. 多维数据库以及它们的所有变体. 第一次接触作为数据模型使用的XML时, 我同样对它产生了浓厚的兴趣. 它的数据抽象模型. 它的驻留内存对象模型. 它的丰富的数据处理工具以及它的查询语言……, 所有这一切给我留下了深刻的印象, 但我对它有一种"似曾相识"的感觉. 后来, 我找到一本对关系和层次化数据库进行比较的旧书, 立即就发现IMS(IBM在20世纪80年代中期以前的旗舰数据库)中的层次化导航函数与XML文档对象模型(DOM)API中的那些函数极为相似. 我后来还发现, XPath查询语言采用的思路和当时一样:让基础SQL引擎来完成导航功能. 以后要提高速度, 只需对查询引擎本身进行改进, 而不必重写基于导航的程序.
另外, 目前在不相似的系统之间进行商家到商家的数据交换时, 通常使用一种已知的数据格式(XML). 这种模式类似于我以前用过的一个系统, 它用著名的"自动票据交换"(Automatic Clearinghouse, ACH)格式来导入和导出银行业务. 它使用一种已知的数据格式和远程通信协议在不相似的系统之间交换数据.
能在一种新技术中找到某些熟悉的东西, 肯定是有用的. 但我发现, 当我谈论一种新技术时, 如果老是说:"它就像……", 我的同事们就会感觉十分不爽. 他们不爽是因为我好像在说这种技术中没有什么新东西, 没有什么改进. 但我真正的意思与此相反, 而是说它们通常都会进行一些改进, 这些改进基于要解决的新问题, 而且可能会以一种新的方式来看待现有的问题. 对我而言, "它就像……"代表着从旧世界到新世界的一座桥梁, 而我就根据这两个世界的联系来看待所有的改进. 我发现, 当我提到新技术上的改进时, 同事们就显得比较高兴了.
我在DevelopMentor的主要工作之一就是设计和讲授OLE DB课程. 在我四处旅行授课的过程中, 学生们会问:"它和ODBC有什么不同?"或者"我为什么要从JDBC转变到它?"总而言之, 他们的问题就是:我得到了什么, 我失去了什么, 以及两者有何相同之处?在多次回答这些问题, 同时研究了许多技术所发生的改变之后, 我突然发现自己已经完全有资格对新的ADO. NET接口的影响进行评定.
顺便提一句, 作为JDBC的发明者, Sun Microsystems公司声称JDBC不是任何东西的缩写形式. 许多人以为它的全称是Java Database Connectivity, 但Sun否认了这一点, 虽然该公司自己的部分文档中仍在沿用这样的说法.
数据访问的改变
讨论数据访问和表示策略时, 我习惯于开玩笑地说, Web浏览器不过是一种"可以唱歌和跳舞的彩色终端". 但是, 借用一段陈词滥调:通过Web浏览器来访问应用程序全面改变了我们设计数据访问策略的方式. 本节将对此进行解释.
首先, 用户数量可能非常多, 而且频繁变化. 在终端机的时代, 用户数量是可以准确预计的, 或至少是可以控制的. 要增大系统的规模, 可在私有网络中增添更多的终端机和用户. 用户还必须先填表才能访问公司的应用程序, 所以我们能对用户群体的增长进行控制. 但是, 在Internet时代, 您的应用程序的用户数量只受限于这个应用程序的流行度. 这正是Internet作为一种商业通信工具的最大的卖点. 公司希望从一台小的服务器开始, 并逐渐扩充到更大的用户群体. 当然, 在这个过程中, 公司只能获得有限的预见性. 它改变了我们设计和编写应用程序的方式.
其次, 用户不会"注销"Internet应用程序, 您有时根本不能通过物理方式识别他们. Internet应用程序中的超链接允许用户立即跳转出去, 以检查自己喜爱的股票或者球队. 如果其他网站包含了新的和有趣的东西, 他们也许永远不会回到您的应用程序. 因此, 不可能在Web应用程序中集成注销逻辑, 也不能保证它的使用. 另外, 由于人们普遍使用动态地址分配协议(比如DHCP)和代理服务器软件, 所以您也不可能根据终端ID来识别用户. 结合用户不会注销应用程序这一事实, 您不可能像在终端时代那样, 根据一台计算设备的位置, 为每个特定的用户都保留一定的存储空间. 这是另一个巨大的改变.
最后, 用户自己完成大量数据输入工作. 在旧式系统中, 悲观并发性和记录锁定之所以能够正常进行, 是因为数据输入由一组终端操作员来完成. 如果两个操作员同时访问与您的账号有关的数据, 而且您的数据正在"忙", 那么其中一名操作员可能暂时放下您的记录, 等待以后录入. Web应用程序则不同, 它将每一个人都变成了数据录入员. 由于不大可能有"两个您"同时更新您的个人和财务信息, 所以乐观并发性显得更实用. 它还意味着数据编辑技术和业务规则必须变得更可靠, 因为非专业的录入员可能录入乱七八糟的东西.
ADO. NET API采用的数据访问模式根据今天的数据访问和输入现状进行了调整. 解决今天所面临的问题时, 连接池. 断开式更新以及乐观并发性是关键--即使是在使用原有的技术时.
本书的结构
第1章"数据:模型. 应用程序和API"要反映的主题是, 一个数据访问API必须在两个方面取得某种平衡:一方面坚持采用一种数据存储样式或者数据库, 另一方面封装尽可能多的功能, 因为单独的类和方法是没有意义的. 本章列举了ADO. NET中的新功能, 并描述了它最适合用于哪些数据存储样式和应用程序类型.
第2章"ADO. NET基础"分3部分来讨论ADO. NET:数据提供程序. ADO. NETDataSet对象模型以及XML数据访问模型. 每个部分都通过一个简单的程序来阐明. XML API以及XML与ADO. NET的集成问题将在第7章进行讨论, 因为我认为XML堆栈是. NET框架的总体数据访问堆栈的一个重要组成部分.
第3章"连接模型:流式数据访问"指出, 大多数数据访问API都以一个提供程序模型为中心, 这个模型对各种具体实现之间的细微区别进行了抽象. 本章解释了ADO. NET对于您熟悉的. 用于访问关系数据存储的"连接. 命令和结果"模型进行的修改. 本章最后总结了一些应用程序特有的特性, 包括连接池和自动分布式处理.
在第4章"DataSet类:关系数据的集合"中, 您会了解到大多数数据访问API都包括"驻留内存的数据表示"的概念, 可利用它在窗体上填充控件, 并可一边遍历数据, 一边进行处理. 在ADO. NET中, 这个模型基于DataSet类及其为它提供支持的集合类, 它们搭建起了一个关系数据库. 本章在介绍DataSet时, 重点讲解了它作为一个独立的对象模型的复杂性.
虽然DataSet是在内存中表示数据的一种便利方式, 但它最大的用处还是作为一个客户端的数据库数据模型来使用. 第5章"DataAdapter:数据库和DataSet的同步"讲解如何将数据从一个数据提供程序传输到一个DataSet, 并将用户以脱机(离线)方式对DataSet进行的更改存回数据库, 使这种更改持久化. 由于数据库供许多用户共享, 而这些用户有可能同时操纵相同的数据, 所以本章讨论了多个用户在脱机模式中更改相同的数据时要解决的问题, 这种问题称为"乐观并发性冲突解析问题". 除此之外, 关于在什么情况下使用一个"直接来自数据库"的流(ADO. NET DataReader), 以及在什么情况下使用一个脱机缓存(ADO. NET DataSet), 并配合通用的应用程序访问模式, 人们还持有不同意见. 本章对此提供了一些指导原则.
如果您想通过一个图形化程序或者网页来表示数据, 就必须将数据库或数据缓存中的数据映射到一些图形控件, 比如文本框. 列表框和数据网格等. 第6章"数据绑定:ADO. NET和GUI"讲解了ADO. NET与用户界面元素的集成. 本章再次讨论了DataReader和DataSet, 不过这一次是在使用ASP. NET Web窗体表示风格的前提下.
由于世界上的大多数数据都存储在关系数据库中, 所以第7章"XML和数据访问的集成"探讨了ADO. NET中用于对"关系数据存储"和"XML表示/处理"进行集成的各种方法. 改进的XML集成能力是ADO. NET的主要优势之一. 本章最后总结了XML与Microsoft旗舰数据库SQL Server进行集成的问题.
数据访问(以及其他模型, 前提是它们具有多个类似的实现, 只是在细节上有所区别)是通过一个提供程序模型来抽象的. 第8章"提供程序:ADO. NET和数据提供程序"探讨了"OLE DB提供程序模型"到"ADO. NET数据提供程序模型"的映射关系. 另外还解释XMLInfoset提供程序的概念, 它是基于XML Infoset模型的. 对提供程序模型的一种抽象. 第9章"消费者的ADO. NET迁移路径"为数据消费者(比如编写数据访问代码的程序员和使用数据的程序, 译文一般保留consumer原文. --译者注)提供了一个有用的参考, 这些consumer可能是从其他数据访问API迁移过来的, 比如ADO. ODBC和JDBC等. 本章的宗旨是让具有不同背景的人快速熟悉ADO. NET, 能将他们的X类或者Y函数映射到ADO. NET的类和方法.
本书第1章就概述了各种类型的数据存储以及使用这些数据应用程序. 作为本书的最后一章, 第10章"ADO. NET和各种数据类型"将根据您已经学到的知识, 再次讨论第1章提出的一些问题, 探讨数据堆栈(ADO. NET和XML)是否真的包含一个适用于每个人的方案. 最后, 对数据访问的未来进行了展望.
如何阅读本书
本书分成3部分:陈述和分析. 通过实例提供的API参考, 以及为需要进行数据转换的程序员提供的纯粹参考性的材料. 理想情况下, 您应该顺序阅读, 但首次阅读时, 没有必要完全理解其中的内容. 在阅读过程中遇到难点, 比如"我为什么要关心这个?"或者"我对此没有概念", 不要停顿, 继续读下去, 通过阅读后文, 难以理解的东西会逐渐明朗化.
第1章和第10章从广义上陈述和分析了数据库类型. 数据库API以及应用程序风格. 您不一定完全理解或者同意其中的每一个论点. 第2~7章详细解释了ADO. NET类. 接口和方法的工作原理. 您既可以全部阅读, 也可以选自己感兴趣的阅读, 但第一次最好按顺序阅读. 第8章和第9章分别是为provider和consumer的作者准备的, 他们可能正在使用其他库, 并希望寻找一个迁移到ADO. NET的途径. 这两章属于参考资料. 对于那些还没有写过OLE DB代码的人, 第8章的内容可能有点难以理解. 本章是为我的一些朋友和学生而写的, 过去几年里, 我和他们一起学习和编写过OLE DB提供程序, 而且他们总是抱怨没有人为他们专门写一本像样的书.
本书没有花费几百页的篇幅来罗列各种类. 接口. 方法和属性信息. 这方面的信息最好参考. NET框架软件开发工具箱(SDK)的联机文档. 花了几小时时间浏览Windows平台文档后, 我对Windows平台就已经非常熟悉了. 不仅框架SDK文档做得不错, OLE DB程序员的参考文档也给人留下了深刻的印象.
观察与文档
本书之所以没有早点儿出版, 是由于几方面的原因. 一个是我知道. NET产品在Beta阶段会发生变化, 而且可能是非常重大的变化. 我可不想在目前大量的"Beta测试版编程"书中再增加一本, 虽然这些书也有一定的价值. 这种书在出版后的几个月之后, 就有可能过时, 并可能误导读者.
除此之外, 我想通过直接试验代码的方式来验证文档中所说的东西. 另外, 我还尝试描述提供程序的一些内部行为, 以及它们的实现细节. 它们在Beta测试过程有可能变动(有时甚至是重大的变动), 而我必须重写一些小节, 并重新思考解决方案. 我必须等待最终版本发布, 这样才能放心运行代码片断, 并再次进行试验.
仅仅通过试验和观察来推导内部工作原理是要冒一定风险的, 因为这些隐藏细节的实现会随着时间的推移而发生改变. 改变的原因可能是软件厂商不断更新和改进它们的产品. 正是由于存在这样的风险, 所以我尝试在本书中对我的试验进行文档化, 使您能在软件或基础数据库发生改变之后, 能够重复我的试验.
其他额外的代码. 勘误(本来的错误, 或者由于产品更新而产生的错误)以及其他额外的信息将发布于本书配套网站staff. develop. com/bobb/adonetbook(本书简体中文译本已根据现有的勘误(截止2003年7月4日)进行了更新. --译者注).