第1章 导读

1. 导读

本书假设读者已经可以使用C#和Visual Studio编程环境进行简单的开发工作,如果大家对使用C#和数据库处理数据还不太熟悉,我们还在第11章和第12章介绍了这些方面的基础知识和注意事项,其中还有一些常用代码的封装。

从本书的名称中,你也许已经了解了本书的内容,无论是专业开发人员,或者是软件开发爱好者,在软件开发中多多少少都会与数据打交道,而本书的主题就是数据应用开发。不过,有一点应该首先说明,本书绝对不是介绍如何使用窗体(WinForm或WebForm)中的数据组件来操作数据库的;因为我们相信这些内容在很多书籍中,或者是在MSDN Library和Help Library中都可以很方便地学习和了解。另一方面,也是很重要的一点,这些窗体数据控件只能从基本数据模型的角度来操作数据;但实际情况是,在项目中,用户数据的表现形式和使用形式都是非常多样化的,并不是只有标准格式的数据表,以及数据的添加、编辑、删除、查询等基本操作。所以,我们将从另一种角度来讨论如何使用C#进行数据应用的开发工作。

那么,我们所讨论的内容有些什么呢?

我们会首先启动一个小型的数据应用项目,这个项目将非常简单,熟练的程序员可能只需要几个小时就可以完成了。但是,我们知道,用户的需求是不断变化的,无论是简单或复杂、无论是Windows窗体项目或Web项目都是如此;所以,我们必须要应对用户提出的一系列需求和问题,并在项目中灵活、有效地实现;而这些就是本书的主题。

本书内容将贯穿数据应用开发的全过程,我们不但要了解基本的开发技术,如C#、ADO.NET、数据库的基本应用等;而且,我们还将从项目的演化过程中学习到更多的开发方法和技巧,并从中讨论如何获取、分析、总结、实现,或者是忽略用户的需求(虽然这听起来有点不科学)。

最终,我们会形成一个数据应用项目开发的整体方案,你可以参考这个方案,在项目中应用、修改或扩展;当然,一个方案并不可能满足所有的开发需要,所以,我们学习开发技术和方法,要充分地理解和掌握其基本原理,将一系列相关的知识融会贯通,并在项目中灵活、合理、高效地应用它们,而不只是照本宣科。

在本书的讨论中,我们都应该多思考,只有在提出问题并解决问题的过程中,我们才能更有效地学习和理解。权威的理论固然值得我们参考,但如果不结合实际,那么,一切都是空谈;一切理论都有其局限性、背景或前提条件,所以,我们要敢于挑战这些理论,然后,我们会去证明,无论结果证明自己是正确的,或是错误的,这些经验都将是我们学习和工作过程中的宝贵财富。

在软件开发中,曾经有一条很有名的理论:不要重复发明轮子。其思想是要充分利用现有资源,不要去做不必要的重复劳动。这当然没有问题;而真正的问题是,作为一名软件开发人员,如果只会拿现有的“轮子”来用,当有一天出现问题时,你是不是知道如何去解决问题,如果不深入理解“轮子”的结构,那么,当轮子出现问题时,我们会修理或改造它吗? 这是一个我们必须思考的问题。

还是以“轮子”为例,最早的轮子主要是木制的,后来就是橡胶、合成材料,以及各种各样的胎纹和轮毂。如果没有这些发展,F1赛车能以三百多公里的时速在赛道上飞驰吗?

作为软件开发人员,我们所需要做的就是掌握基本的技术和方法,如轮子是圆的(有点傻?也许吧)。然后,我们会综合考虑各种应用环境,合理地应用或改进,如轮子需要满足多高的时速、是否需要满足雨天或雪天的需要等等;只有掌握了这些基本的知识以后,我们才能更加有效地应用和发展。

社会在发展,技术也在发展,我们可能不需要重复发明“轮子”,但我们必须学习如何根据需要合理使用或改进“轮子”,这就要求我们在软件开发学习和实践中有扎实的基本功、掌握灵活的开发方法,以及务实的态度;此外,由于软件开发本身就是一项创造性的工作,所以,有一点点创新精神和冒险精神也是必须的,难道不是吗?

1.1. 关于本书

1.1.1. 本书内容

简单地说,本书的内容就是介绍如何使用C#及相关资源进行数据应用项目的开发;但在这一过程中,我们会讨论一系列的技术应用特点,以及软件开发中的一些方法学;这些内容将贯穿于软件开发的全过程,具体内容如下:

第2章,我们将启动本书中的示例项目,我们会讨论如何与用户交流,并从中获取真正的需求;这将是项目成功的第一步,道理很简单,只有明确了目标,我们才能向着正确的方向开展工作。

第3章,将进行开发前的准备工作,我们将讨论将用户需求转换成软件功能,而这一转换过程往往并不是线性的,实际上,对于不同的开发者,其转换方法有多种多样,但是,我们需要掌握其中的一些基本方法和过程。

第4章,将使用C#和ADO.NET实现项目的第一个版本,我们会使用最基本的方法来实现,就当是热身了。

第5章,用户需求的变化说来就来,这是很常见的事情。在这一章,我们将根据用户需求的变化,讨论如何应对这些变化,并且会讨论如何在软件结构设计上做出改变,以便灵活应对更多的变化。

第6章,我们将根据前面的讨论,对将软件结构划分为三个层次,即表现层(Presentation layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。在这一章,我们将讨论数据层的操作及代码封装,从本章的讨论中,我们可以了解如何使用相同的接口和组件完成不同数据库类型的基本操作。

第7章,我们将讨论业务层的操作,在实现用户需求时,我们将不再考虑是Windows窗体项目还是Web项目,或者是使用了什么类型的数据库;因为,我们已经将业务层与界面层、数据库进行了分离。

第8章,应用新的数据层和业务层组件,我们将重写Windows窗体项目,此时,我们会发现,代码的抽象和分离为我们的开发工作带来了什么样的变化。

第9章,和Windows窗体项目的重构相似,我们可以很方便地进行ASP.NET项目的开发,此时,我们使用了相同的业务层和数据层组件,只需要很少的代码来完成Web项目的开发。从这一过程中,我们将更进一步地理解软件结构的设计。

第10章,作为扩展,我们将讨论如何在自己的代码结构中支持更多的数据库类型,本章,我们就在数据层组件中添加对MySQL数据库的支持。

第11章,介绍在C#编程中的数据处理,包括C#语言本身和.NET Framework类库中相关的数据处理方法和注意事项,并介绍如何根据数据操作特点封装一系列的类型转换方法和两个数据容器类(CDataItem和CDataCollection类)。

第12章,我们将以SQL Server数据库为主,介绍数据库与ADO.NET组件的应用基础,如果大家都这部分不太熟悉,可以在项目开发前先了解这一章的内容。实际上,这其中的很多内容也是当前主流关系型数据库系统中最常用的基础知识。了解了这些知识,你就可以很方便的学习、理解和使用各种数据库系统。

第13章,讨论如何通过已封装的代码库来处理“主/子”结构数据模型。

第14章,讨论如何根据GDI+技术进行统计图表的绘制工作。

第15章,给出本书中代码库的介绍和索引,方便大家查询和参考。

第16章,讨论本书没有详细讨论的一些主题,为大家进一步学习提供参考。

1.1.2. 如何使用

第11章和第12章分别介绍了在C#中处理数据,以及使用ADO.NET操作数据库的基本知识。如果读者是C#的初学者,应该首先阅读这两章内容,如果对这部分比较熟悉,也可以先看一看我们封装的类型转换方法,以及CDataItem和CDataCollection类的使用,因为我们在第5章以后会大量使用这些封装的资源。

第2章到第10章演示了一个项目的进化,从中,我们提炼出了软件的三层结构,并应从中得到启发,为软件架构的学习和应对大型项目作准备。对于初学者,在了解一些必要的基础知识以后,可以按照这些章节的顺序一步步的理解项目的进化过程。其中,第10章介绍了如何将MySQL的支持集成到我们的代码库中,这些内容可以加深我们对代码库结构的映像,对于需要在.NET项目中操作MySQL数据库的朋友,这一章将会提供帮助。

从第13章以后,可以作为学习的扩展内容,读者可以在需要时参考。

1.2. 开发环境

本书项目示例基于.NET Framework 4.0平台,Windows窗体项目使用Visual C# 2010 Express(以下简称VC#)开发,而ASP.NET项目则使用Visual Web Developer 2010 Express(以下简称VWD)。在开发工具安装过程中,如果你的电脑中已经安装有SQL Server的任何版本,则不需要安装SQL Server 2008 Express了。

另外,这两种开发环境在学习中都是可以免费使用的,并不需要大家有太多的成本,只需要免费注册一下就行了。当然,如果你的机器中已经安装了高级版本的Visual Studio,本书的示例也可以完全适用。

在这里还要说明的是数据库的使用,本书示例中,共使用了三种数据库:

  • Access,这是Microsoft Office的一部分,是一款轻量级的桌面数据库系统,常用于较小型的单机版软件项目。
  • SQL Server,同样是Microsoft公司的产品,不过,这是一款大型的网络数据库系统,其竞争对手是Oracle、DB2等传统的大型数据库产品。本书中使用的版本是包含了SP4的SQL Server 2005 Express。显然,这个版本已经比较老了,不过,由于这是一款网络数据库,所以,版本并不会影响我们的操作,本书的示例完全可以应用在更高版本的SQL Server数据库系统中。
  • MySQL,这原本是一款开源数据库,现在由Oracle公司进行维护,大家可以在Oracle公司网站下载安装它的最新版本。MySQL同样是一款网络数据库,第10章会有一些基本的介绍,对于更多功能的应用,建议大家参考官方文档。

1.3. 代码约定

每一个软件开发者、团队或公司,都会有自己的软件开发约定,而代码编写的约定是开发工作中一项非常重要的内容。良好的代码编写习惯,以及规范化的编写标准,可以有效地提高代码的编写和维护的效率,本书中,我们最终会形成一个小型的代码库,所以,有一定的代码编写约定当然也是少不了的。以下将给出一些基本的代码库定义和组织约定,而对于基本的代码编写习惯,我们就不做过多的要求了。

本书的代码库将以命名空间(namespace)的形式组织管理,我会将这些代码库全部放在chyx命名空间中。关于这一点,需要说明一下,在很多关于代码组织的建议中,都会考虑使用反向域名的形式来组织代码库(命名空间或包),比如我的域名是caohuayu.com,那么就是将代码组织到com.caohuayu命名空间中,不过,这样会多打很多字符,我们在这里就不这样做了^^。当然,你在实际工作中,还是要遵守团队的约定来组织代码,以避免出现不必要的麻烦。

除了命名空间,在代码中,还以一些常用成员,如:

  • 类(class定义)。类是构建组件的最常用,也是最基本的类型之一,在我们的代码库中,类名都以大写字母C开始,然后会使用单词首字母大写的形式。如CSqlEngine类,CAccessEngine类等。在我们的代码库中,有一个特殊的类,在chyx命名空间中的静态类CC,这个类用于封装一些通用的代码。
  • 接口(interface定义)。以大写字母I开始,然后使用单词首字母大写的形式。如IDbEngine、IDbRecord等。
  • 结构(struct定义)。以大写字母S开始,然后使用单词首字母大写的形式。
  • 枚举(enum定义)。以大写字母E开始,然后使用单词首字母大写的形式。如EDbEngineType。
  • 委托(delegate定义),使用大写字母D开始,然后采用单词首字母大写的形式。
  • 方法名、属性名和公共字段名。使用单词首字母大写的形式。如Connect()方法。

有了这些共同语言,我们就开始启动本书的示例项目吧。

目录