科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用不到140行C-sharp代码开发面向对象的数据库(上篇)

用不到140行C-sharp代码开发面向对象的数据库(上篇)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文的目标是用不到140行的C#代码编写一个简单的面向对象的数据库(OODB),C#和.NET框架提供了很多内置的函数,我们可以利用它们来帮助我们实现这一目标。

作者:builder.com.cn 2007年2月27日

关键字: 面向对象 C# csharp XML SQL

  • 评论
  • 分享微博
  • 分享邮件

本文的目标是用不到140行的C#代码编写一个简单的面向对象的数据库(OODB)。很显然这不会是一个最简单的项目;但是C#和.NET框架提供了很多内置的函数,我们可以利用它们来帮助我们实现这一目标。这个数据库的要求如下:

  • 必须能够保存对象的状态,而不需要向对象加入额外的信息,也不需要准确地告诉数据库如何保存对象。
  • 必须能够从数据存储区里获得对象,并向用户提供一个完整的业务对象,而不需要用户将数据库的字段映射给对象。
  • 必须能够通过一级C#表示来查询。例如,查询不一定要放在双引号里,比如SQL查询所要求的双引号,而且应该是类型安全的。
  • 必须要有一种特别的查询机制。这一机制要求查询必须放在双引号里,而且不用是类型安全的。
  • 必须能够从数据库里删除对象,提供一个“深度删除(deep delete)”的选项。
  • 必须能够更新数据库里的对象。

很显然,企业级OODB的要求会严格得多,而且会有其他的特性,比如索引、触发器和并发等。本文所呈现的(核心思想)是充分利用.NET框架内置的功能就可以创建一个简单的OODB。我们在这里不是要颠覆性地创建一个OODB,而是要显示利用一点点创造力能够实现什么。

如何保存数据

将对象保存在数据库里我们有很多选择。其中最容易想到的一个是使用二进制序列化将其序列化。这让我们能够利用内置的二进制序列化(System.Runtime.Serialization命名空间)的优势,并使得保存/获取对象变得轻而易举。但是如果采取这种方式,我们就不得不需要编写搜索例程来搜索数据了。我们还必须面对对象以及对象类型相互隔离的状况。由于这些限制以及项目目标(的要求),二进制序列化对于我们来说不是最佳的选择。

第二种选择是XML序列化。XML序列化提供了很多二进制序列化的优势,以及一些有趣的功能。与二进制序列化比较起来,XML序列化最大的一个优势是对象保存在XML里。这意味着这些对象的搜索以及对象/对象类型的隔离已经在极大程度上被处理了。由于这些原因,XML序列化就是我们将要在这个项目里使用的方式,它能够满足第1项和第2项要求,并能够让我们轻轻松松就实现其他的要求。

关于XML序列化要知道的一件事情是,它一次只能够序列化/反序列化一个父对象。这意味着我们将需要在同一个文件里用一个XML布局保存多个父对象。这一问题可以通过将StringReaderStringWriter对象当作流而不是对象使用来解决。一旦我们把经过序列化的对象放到字符串里,我们就可以使用一个XmlDocument对象把对象的数据添加到数据库的XML文件里。要获得更多关于XML序列化的信息,请参阅我的XML序列化文章

一个带有两个Customer(用户)对象的简单数据库看起来就像列表A一样。

列表A

<Database>
  <XmlDB.Order>
    <Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Identity>76a0558b-a8c7-42e3-8f1d-c56319365787</Identity>
      <CustomerIdentity>6f5e9a2b-b68f-4b6d-9298-fbe5f135dd25</CustomerIdentity>
      <DatePlaced>2006-11-21T07:12:16.3176493-05:00</DatePlaced>
    </Order>
    <Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Identity>16d8f0b8-46c6-47c3-ac6b-a0b0e0852970</Identity>
      <CustomerIdentity>61cf2db4-0071-4380-83df-65a102d82ff2</CustomerIdentity>
      <DatePlaced>2006-11-21T07:12:26.0533326-05:00</DatePlaced>
    </Order>
  </XmlDB.Order>
  <XmlDB.Customer>
    <Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Identity>6f5e9a2b-b68f-4b6d-9298-fbe5f135dd25</Identity>
      <LastName>Cunningham</LastName>
      <FirstName>Marty</FirstName>
    </Customer>
    <Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Identity>61cf2db4-0071-4380-83df-65a102d82ff2</Identity>
      <LastName>Smith</LastName>
      <FirstName>Zach</FirstName>
    </Customer>
  </XmlDB.Customer>
</Database>

正如你能看到的,这个格式允许我们快速地分析XML,并找到对象类型的不同分组。

既然我们已经决定用XML序列化来保存对象,那么我们就需要找一种在内存中保存数据的方式,以便可以让用户与其交互。实现这一目标的一个显而易见的选择是XmlDocument类,因为它为XML文件提供了搜索和更新能力。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章