查询 .NET Framework 应用程序中的数据集

注意

数据集和相关类是 2000 年代初的旧 .NET Framework 技术,使应用程序能够在应用程序与数据库断开连接时处理内存中的数据。 它们对于使用户能够修改数据并持续更改回数据库的应用程序特别有用。 虽然数据集已被证明是一项非常成功的技术,但我们建议新的 .NET 应用程序使用 Entity Framework Core。 实体框架提供了一种更自然的方式来将表格数据作为对象模型,并且具有更简单的编程接口。

若要搜索数据集中的特定记录,请使用 DataTable 上的 FindBy 方法,编写自己的 foreach 语句以循环访问表的行集合,或使用 LINQ to DataSet

数据集区分大小写

在数据集中,表名和列名默认不区分大小写;也就是说,数据集中名为“Customers”的表也可以称为“customers”。这与许多数据库(包括 SQL Server)中的命名约定一致。 在 SQL Server 中,默认行为是不能仅按大小写区分数据元素的名称。

注意

与数据集不同,XML 文档区分大小写,因此架构中定义的数据元素的名称区分大小写。 例如,架构协议允许架构定义一个名为 Customers 的表和一个名为 customers 的不同的表。 使用的架构包含仅有大小写不同的元素,用于生成数据集类时可能会导致名称冲突。

但是,区分大小写可能是数据集中数据解释方式的一个因素。 例如,如果你筛选数据集表中的数据,搜索条件可能会返回不同的结果,具体取决于比较是否区分大小写。 可以通过设置数据集的 CaseSensitive 属性来控制筛选、搜索和排序是否区分大小写。 默认情况下,数据集中所有表都继承此属性的值。 (可以通过设置表的 CaseSensitive 属性来覆盖每个表的此项属性。)

在数据表中查找特定行

查找类型化数据集中具有主键值的行

  • 若要查找行,请调用使用表的主键的强类型 FindBy 方法。

    在下面的示例中,CustomerID 列是 Customers 表的主键。 这意味着生成的 FindBy 方法是 FindByCustomerID。 该示例演示如何使用生成的 FindBy 方法将特定的 DataRow 分配给变量。

    NorthwindDataSet.CustomersRow customersRow = 
        northwindDataSet1.Customers.FindByCustomerID("ALFKI");
    

查找非类型化数据集中具有主键值的行

  • 调用 DataRowCollection 集合的 Find 方法,同时将主键作为参数传递。

    下面的示例演示如何声明名为 foundRow 的新行,并为其分配 Find 方法的返回值。 如果找到主键,则列索引 1 的内容将显示在消息框中。

    string s = "primaryKeyValue";
    DataRow foundRow = dataSet1.Tables["AnyTable"].Rows.Find(s);
    
    if (foundRow != null) 
    {
        MessageBox.Show(foundRow[0].ToString());
    }
    else
    {
        MessageBox.Show("A row with the primary key of " + s + " could not be found");
    }
    

按列值查找行

根据任何列中的值查找行

  • 数据表是使用 Select 方法创建的,DataRow 方法根据传递给该方法的表达式返回一个 Select 数组。 有关创建有效表达式的详细信息,请参阅有关 Expression 属性的页面的“表达式语法”部分。

    以下示例演示了如何使用 DataTableSelect 方法来查找特定行。

    DataRow[] foundRows;
    foundRows = dataSet1.Tables["Customers"].Select("CompanyName Like 'A%'");
    

当数据集中的表相关时,DataRelation 对象可以使相关记录在另一个表中可用。 例如,包含 CustomersOrders 表的数据集可供使用。

通过在父表中调用 DataRowGetChildRows 方法,你可以使用 DataRelation 对象查找相关记录。 此方法返回一个相关子记录的数组。 或者,可以在子表中调用 DataRowGetParentRow 方法。 此方法从父表中返回单个 DataRow

本页提供了使用类型化数据集的示例。 有关非类型化数据集中导航关系的信息,请参阅导航 DataRelation

注意

如果你使用的是 Windows 窗体应用程序,并且使用数据绑定功能来显示数据,设计器生成的窗体可能会为应用程序提供足够的功能。 有关详细信息,请参阅将控件绑定到 Visual Studio 中的数据。 具体请参阅数据集中的关系

下面的代码示例演示如何在类型化数据集中向上和向下导航关系。 代码示例使用类型化 DataRow (NorthwindDataSet.OrdersRow) 和生成的 FindBy PrimaryKey (FindByCustomerID) 方法来查找所需的行并返回相关记录。 这些示例仅在你拥有以下项时才能正确编译和运行:

  • 包含 Customers 表的名为 NorthwindDataSet 的数据集的实例。

  • Orders 表。

  • 将这两个表关联起来的名为 FK_Orders_Customers 的关系。

此外,需要用数据填充这两个表,以返回任何记录。

返回所选父记录的子记录

  • 调用特定 Customers 数据行的 GetChildRows 方法,从 Orders 表中返回行的数组:

    string custID = "ALFKI";
    NorthwindDataSet.OrdersRow[] orders;
    
    orders = (NorthwindDataSet.OrdersRow[])northwindDataSet.Customers.
        FindByCustomerID(custID).GetChildRows("FK_Orders_Customers");
    
    MessageBox.Show(orders.Length.ToString());
    

返回所选子记录的父记录

  • 调用特定 Orders 数据行的 GetParentRow 方法,从 Customers 表中返回单行:

    int orderID = 10707;
    NorthwindDataSet.CustomersRow customer;
    
    customer = (NorthwindDataSet.CustomersRow)northwindDataSet.Orders.
        FindByOrderID(orderID).GetParentRow("FK_Orders_Customers");
    
    MessageBox.Show(customer.CompanyName);