【问题标题】:Populating multiple tables in typed dataset在类型化数据集中填充多个表
【发布时间】:2013-03-10 14:47:07
【问题描述】:

我会尽量简化我的问题。

请随意评论和纠正我的英语。希望你能理解我。

我的主要问题是: 是否有任何简单且“自动化”的方法,仅使用与其他表中的数据相关的行来填充数据集中的表?

假设我们有以下架构的数据库:

现在,我正在尝试用“订单”表做同样的事情,并创建自定义方法“FillByDate”。它可以工作,但有一个小问题:

        DataSet1 myDataSetInstance = new DataSet1();
        DataSet1TableAdapters.OrdersTableAdapter OrdersTA = new DataSet1TableAdapters.OrdersTableAdapter();

        OrdersTA.FillByDate(myDataSetInstance.Orders, new DateTime(2013, 1,1), DateTime.Now);

        foreach (var row in myDataSetInstance.Orders)
        {
            MessageBox.Show(row.Comments); // OK
            MessageBox.Show(row.CustomersRow.Name); //NULL
        }

从客户表中获取相关行是不可能的 - 首先我必须手动填充该表。我可以看到两种方法来做到这一点

  • 获取此表的全部内容 - 但这将是大量不需要的数据
  • 在它的 TableAdapter 中创建自定义查询 - 类似于 FillByOrdersByDate(@Date1, @Date2) - 当我只有 2 个表和 1 个关系时,这很容易,但是对于更多表,此方法将需要为每个 TableAdapter 进行数十个自定义查询.

我真的相信,必须有“更好”的方法来做到这一点。

【问题讨论】:

    标签: c# .net database strongly-typed-dataset tableadapter


    【解决方案1】:

    解决此问题的几种方法 - 如果您只打算读取数据,则可以使用连接查询来填充数据集。 或者,您可以使用连接查询来填充子表。查看您的示例,假设您想要列出特定城市中所有客户的客户和订单。您已经为您的客户 TA 编写了一个“FillbyCity”查询 - 您将为您的订单 TA 编写一个类似的 FillbyCity 查询。是的,您可以使用对客户表的连接来执行此操作:SELECT Orders.* FROM Orders INNER JOIN customers ON customers.customerid = orders.customerid WHERE customers.city = @city 然后,您可以使用数据关系将各个客户链接到他们的订单,具体取决于您的应用程序的要求。

    (如果您有 David Sceppa 的“Programming ADO.Net 2.0”,这将在第 7 章中讨论)

    “但是对于更多的表,此方法将需要为每个 TableAdapter 进行数十个自定义查询。”为什么是几十个?我不确定你要去哪里。

    (PS 你的英语很好,除了把它和它混为一谈——但很多母语人士也这样做。..)

    【讨论】:

    • 使用 JOIN 将connect 相关表合并为一个表。 OP 正在谈论在 DataSet 中维护几个相关的表。
    • G.我认为您没有仔细阅读我的 SQL。该技术是使用 JOIN 查询,但只从一个表中提取数据。这将实现 OP 试图实现的目标。正是出于您提到的原因,我并不是建议使用“常规” JOIN 查询。
    【解决方案2】:

    有一个晦涩难懂的...甚至不知道如何称呼它 - ADO.NET SQL 扩展或其他东西 - 一个名为 SHAPE 的命令,它描述了您正在寻找的关系和 ADO.NET使用“特殊”SQL 为您提供一个包含多个相关表的数据集。

       SHAPE  {select * from customers}
       APPEND ({select * from orders} AS rsOrders
               RELATE customerid TO customerid)
    

    它工作得很好,但我认为它已经过时并且几乎没有(不受)支持

    MS 建议将 SHAPE 提供程序折旧并改用 XML(抱歉 - 丢失了链接,但那是在 .NET 1.1 中返回的)并且他们指向 XML。我认为FOR XML T-SQL 子句可以解决问题。我自己(还没有)完成它,我使用 FOR XML 来填充 DataSet,但如果您按照 answer I left 中的链接访问另一个类似问题,我认为它会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      相关资源
      最近更新 更多