【问题标题】:Why do typed DataSet methods return unexpected results为什么类型化的 DataSet 方法会返回意外结果
【发布时间】:2011-09-29 05:04:13
【问题描述】:

我使用typed DataSets 访问数据,通过DataSet Designer 配置它们(大致思路在this 教程中解释)。

对于每个表,首先会自动创建一个GetData() 方法。它返回一个DataTable,与数据库中的基础表具有相同的模式(即列)。如果现在我使用'Add query' 选项创建一个自定义方法,它应该只返回部分数据(比如六列中的三列),自动生成的方法返回的 DataTable 仍然由六列组成,其中三列不包括数据。

这有一个烦人的副作用,当我将这个 DataTable 绑定到 GridView(显然使用 ObjectDataSource)时,这些空列也会出现在 GridView 中,所以我必须手动删除它们。

另一个相关问题是,如果我将来自另一个表的数据添加到相应的SQL-query 列(例如使用内部连接或子查询),相反这些列不会被添加到 GridView,尽管我可以在Boundfield 中手动绑定它们。

因此,如果这里有人尚未完全迁移到实体框架并且可以解释此行为并帮助克服这些问题,我将非常感谢您的回答。提前谢谢你。

更新:

我的期望是找到从数据集设计器在我的 SQL 查询之上创建的 get 方法中获取 DataTable 的方法,这将在其架构中反映此查询的结果。在教程中,他们说GetData() 方法为您创建并填充 DataTable 并将其作为方法的返回值返回。如此直观地为什么不使用匹配的字段创建一个新表。

所以我希望我做错了什么。或者我的期望是错误的,但是有人可以解释我,为什么。

【问题讨论】:

  • @Smudge202:我使用的是 C#

标签: asp.net datatable dataset strongly-typed-dataset dataset-designer


【解决方案1】:

我还没有尝试过,但我想您可以通过将数据表结果转换为另一种已知类型并相应地绑定网格来解决这些问题。 (我知道这没什么意义,请耐心等待......)

作为一个例子(尽管是一个无类型的数据集):

编辑 - 为你换成 C#:

EDIT2 - 哇,在线转换器让我大失所望 - 重新输入,所以现在可以编译了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

public class myView 
{ 
    public string OrderNumber { get; set; } 
    public int Quantity { get; set; } 
    public decimal PricePerUnit { get; set; } 
    public decimal TotalPrice { get; set; } 
}

public void SO9(System.Data.DataTable mockTypedDatatable)
{
    IEnumerable<myView> results = mockTypedDatatable.AsEnumerable().Select(n => new myView {    
                OrderNumber = Convert.ToString(n["OrderNumber"]),    
                Quantity = Convert.ToInt32(n["Quantity"]),    
                PricePerUnit = Convert.ToDecimal(n["Price"])});
    results.ToList().ForEach(x => x.TotalPrice = x.Quantity * x.PricePerUnit);
    myGridView.DataSource = results;      
    myGridView.DataBind();
}

在示例中,我将假数据表中的列分配给某些属性,而其他属性通过其他方式填充(在示例中,简单地乘以 Quanty * Price,但您可以轻松地扩展它)。

希望有帮助

【讨论】:

  • 感谢您的回答。这是一个可能的选择,但不幸的是,这并不是我想要的。实际上,这更像是一种解决方法,而不是真正的解决方案。再次感谢您的时间和 c# :)
  • @Kirill 没问题,很抱歉没有帮助。那么,您正在寻找 GridView 来接收类型化数据集、忽略空列并包含 SQL 中指定的其他列?如果是这样,最好使用非类型化的 DataTables 吗?这样,空列将不存在,因此会出现在网格中,并且 gridview 将能够根据您在 SQL 中选择的字段正确解析表的内容/列。
  • 嗯,我的意图有点不同。我的期望是找到从我的 SQL 查询之上的 DataSet Designer 创建的 get 方法获取 DataTable 的方法,这将在其模式中反映此查询的结果。在教程中,他们说 GetData() 方法为您创建并填充 DataTable 并将其作为方法返回值返回。如此直观,为什么不创建一个包含匹配字段的新表。
  • 所以我希望我做错了什么。或者我的期望是错误的,但是有人可以解释我,为什么。
  • 我明白了。好吧,我认为您不能使用类型化的数据集来做到这一点。要使用普通数据集,请考虑使用 SqlDataAdapter,使用 SqlCommand 初始化,然后使用 SqlConnection 和您的 T-SQL 初始化。使用 SqlDataAdapter.Fill() 方法创建和填充数据集。然后,您可以枚举生成的 DataSet 的列属性,以便在需要时将数据转换为另一种形式,或者只是绑定到它。
【解决方案2】:

好的,我可以说我已经找到了解决方法。

解释是,相应的 TableAdapter 通过它的任何 GetData() 方法(包括自定义方法,如 GetReducedSetOfData())创建和返回,而不仅仅是一个通用的 DataTable,而是精确类型的 DataTable(例如,在我的例子中是 CarSetsDataTable)。也许这正是我忽略的强类型数据集的本质。

在我看来,解决方案很简单。您不必在现有 DataAdapter 中创建新的自定义方法,将可能修改过的数据模式作为返回值,而是为同一个 db 表创建其他 DataAdapter,这将完全返回您需要的其他自定义 SQL 查询的结果。默认 GetData() 方法。

我不知道创建许多 DataAdapter 是否会产生任何副作用,但它似乎是一种安全的方法,可以轻松地从类型化的 DataSet 中准确获取所需的数据。

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2021-01-16
    • 2023-03-03
    相关资源
    最近更新 更多