65.9K
CodeProject 正在变化。 阅读更多。
Home

适用于 .NET 的后关系数据库简介:Matisse - 第 5 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (20投票s)

2004 年 3 月 30 日

4分钟阅读

viewsIcon

97922

使用后关系数据库进行面向对象编程。

引言

本系列文章的 第 3 部分第 4 部分 分别介绍了使用 Matisse 后关系数据库 进行 .NET 编程;使用“对象 API”插入对象,以及分别在不使用映射工具的情况下使用 ADO.NET 和 SQL 从数据库检索对象。在本文中,我将展示如何使用对象 API 来更新和删除对象、使用索引查找对象以及进行关系导航。

对象 API 为操作 Matisse 对象提供了面向对象的接口。这些 API 由 mt_stbgen 代码生成工具生成。何时应该使用对象 API(或 ADO.NET)?以下是我的回答:

  • 当您使用数据感知控件时,需要使用 ADO.NET。
  • 使用对象 API 来创建、更新和删除对象。您也可以为此目的使用 SQL 存储过程。我将在接下来的文章中讨论这个问题。
  • 使用 ADO.NET 来检索对象。但是,如果您可以使用索引来查找对象,请使用对象 API 的索引以获得更好的性能。
  • 如果可以从一个对象导航到另一个对象,请使用对象 API 进行导航。这比发出另一个 SQL 查询来获取同一个对象要快得多。

大多数情况下,对象 API 的性能优于 ADO.NET。此外,对象 API 通过在编译时(而不是运行时)检查许多内容来最大程度地降低程序出错的风险。

以下是之前的文章列表:

更新属性

以下代码段是 Project 类的一部分,该类由 mt_stbgen 代码生成工具生成。(我将继续使用与前几篇文章相同的数据库模式。)无需关注代码细节,只需注意它定义了一个 C# 属性。

namespace MatisseApp {
    using System;
    using com.matisse.reflect;
    using com.matisse.Data;
    using com.matisse;  
   
    //  A class generated by Matisse
    /// <summary>
    /// Project is a schema class generated by Matisse.
    /// </summary>
    public class Project : MtObject {
 
        //  Generated constructor
        /// <summary>
        /// Default constructor provided as an example.  
        /// You may modify or delete this constructor
        /// </summary>
        public Project(MtDatabase db) : 
                base(GetClass(db)) {
        }   
      
        //  Generated property, do not modify
        /// <summary>
        /// Property for attribute 'Budget'
        /// </summary>
        public System.Decimal Budget {
            get {
                return GetNumeric(GetBudgetAttribute(Database));
            }
            set {
                SetNumeric(GetBudgetAttribute(Database), value);
            }
        }

由于 Project 类已在数据库中定义了类型为 decimal 的 Budget 属性,因此生成的 C# 类具有如上所示的 Budget 属性。当您更新 Matisse 对象属性的值时,只需使用属性的 set 访问器即可。

    Project prj;
 
    // Retrieve a Project object from the database and assign it to prj
    // Update the value of the project's budget
    prj.Budget = prj.Budget + 200000;

关系导航和更新

使用后关系数据库的一个主要优势在于,您可以轻松地在对象之间导航,例如,从 Project 对象获取 Manager 对象。下一段代码是 Project 类的一部分,它定义了访问两个关系(MembersManagedBy)的属性。同样,我们不要关注代码细节,但请注意它定义了两个 C# 属性。

        //  Generated property, do not modify
        /// <summary>
        /// Property 'Members': Gets and sets the 'Members' successors
        /// </summary>
        public Employee[] Members {
            get {
                return ((Employee[])
                (GetSuccessors(GetMembersRelationship(Database), typeof(Employee))));
            }
            set {
                SetSuccessors(GetMembersRelationship(Database), value);
            }
        }
 
        //  Generated property, do not modify
        /// <summary>
        /// Property 'ManagedBy': Gets the 'ManagedBy' successor
        /// </summary>
        public Manager ManagedBy {
            get {
                return ((Manager)(GetSuccessor(GetManagedByRelationship(Database))));
            }
            set {
                SetSuccessor(GetManagedByRelationship(Database), value);
            }
        }

以下程序检索一个项目的经理和成员,然后为该项目设置其他经理和成员。

    Project prj;
    // Retrieve a Project object from the database and assign it to prj
    Manager mgr = prj.ManagedBy;
    Employee[] members = prj.Members;
 
    // Update the relationships
    Manager otherManager;
    Employee[] otherMembers;
    prj.ManagedBy = otherManager;
    prj.Members = otherMembers;

其他关系 API

代码生成器提供了更多访问关系的 API。下面的列表是为 Project 类的 Members 关系生成的函数。

Members 关系 API 描述
MembersSize 返回关系中对象的数量(后继项),即项目的成员数量。
MembersEnumerator 返回一个枚举器来迭代关系中的对象。
PrependMembers 在关系开头添加新成员。
AppendMembers 在关系末尾添加新成员。
RemoveMembers 删除成员。
ClearMembers 删除关系中的所有成员。

使用索引查找对象

Matisse SQL 优化器利用索引来优化查询性能,但您也可以使用代码生成器生成的索引 API。索引 API 的性能比动态 SQL 稍快,因为它们不需要 SQL 语句编译,并且您的程序也更简单。但是,只有当您的搜索条件包含在单个索引中时,您才能使用这些 API;否则,您需要使用 SQL 查询。

假设您已在 ProjectName 属性上定义了一个索引 ProjNameIndex。下一行代码返回一个名为“Whidbey”的 Project 对象。

    Project prj = Project.LookupProjNameIndex (dbconn, "Whidbey");

这很简单。请注意,还有其他 API 允许您进行范围查询。

全文搜索

Matisse 具有全文索引功能,称为“入口点字典”。例如,如果您需要在项目描述属性上执行全文搜索,请定义一个入口点字典,如下所示:

CREATE ENTRY_POINT DICTIONARY proj_desc_ep_dict
  ON Project (Description)
  MAKE_ENTRY "make-full-text-entry";

下一段代码检索所有描述包含“.NET”一词的项目。

    foreach (Project prj in Project.Proj_desc_ep_dictEnumerator(
        dbconn, ".NET") {
        // ...
    }

总结和下一篇文章

本文介绍了使用“对象 API”进行 Matisse 数据库编程的基础知识。虽然使用 ADO.NET 或对象 API 几乎可以完成任何事情,但 ADO.NET 通常更适合查询,而对象 API 在其他方面则更简洁高效。

在我的下一篇文章中,我将展示一些使用 Matisse 进行 ASP.NET 编程的示例。

<< 上一篇 | 下一篇 >>

历史

  • 2004 年 3 月 30 日:初始版本

许可证

本文未明确附加任何许可证,但可能在文章文本或下载文件中包含使用条款。如有疑问,请通过下方的讨论区联系作者。作者可能使用的许可证列表可在 此处 找到。

© . All rights reserved.