在类型化数据集中填充多个表

时间:2013-03-10 14:47:07

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

我会尽可能地尽量简化我的问题。

随意评论并更正我的英语。希望你能理解我。

我的主要问题是: 是否有任何简单且“自动”的方式,只在数据集中填充与其他表格中的数据相关的行?

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

Database schema

现在,我正在尝试使用表“Orders”进行相同的操作,并创建自定义方法“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
        }

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

  • 获取此表的全部内容 - 但它将是大量不需要的数据
  • 创建自定义查询,在它的TableAdapter的 - 像FillByOrdersByDate(@日期1,@日期2) - 它很容易,当我只有2个表和1间的关系,但更多的表这种方法将需要几十个自定义查询的每个TableAdapter的

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

2 个答案:

答案 0 :(得分:0)

要解决此问题的几种方法 - 如果您只是要读取数据,则可以使用连接查询来填充数据集。 或者,您可以使用连接查询来填充子表。查看您的示例,假设您要列出特定城市中所有客户的客户和订单。您已经为您的客户TA编写了“FillbyCity”查询 - 您将为您的订单编写类似的FillbyCity查询。是的,您可以使用连接到customers表来执行此操作: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你的英语很好,除了把它和它的混合起来 - 但很多母语人士也这样做。)

答案 1 :(得分:0)

有一个模糊的......甚至不知道该怎么称呼它 - 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中的链接到另一个类似的问题,我认为它会起作用。