为什么类型化DataSet方法会返回意外结果

时间:2011-07-05 23:07:03

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

我使用typed DataSets来访问数据,通过DataSet Designer进行配置(一般的想法在this教程中进行了解释)。

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

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

另一个相关的问题是,如果我使用来自另一个表的数据添加到相应的SQL-query列(例如,使用内部联接或子查询),则相反的这些列不会被添加到GridView中,我可以在Boundfield

中手动绑定它们

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

更新:

我的期望是找到从我的SQL查询的DataSet Designer创建的get方法获取DataTable的方法,这将在其模式中反映此查询的结果。在教程中,他们说GetData()方法为您创建并填充DataTable,并将其作为方法的返回值返回。因此,直观地说,为什么不创建具有匹配字段的新表。

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

2 个答案:

答案 0 :(得分:0)

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

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

编辑 - 换成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的简单乘法,但您可以轻松扩展它)。

希望有所帮助

答案 1 :(得分:0)

好的,我可以说我已经找到了如何解决它。

解释是,相应的TableAdapter通过其任何GetData()方法(包括自定义方法,如GetReducedSetOfData())创建并返回,而不仅仅是通用DataTable,而是完全类型化的DataTable(例如,在我的情况下为CarSetsDataTable)。也许这正是我忽略的强类型DataSet的本质。

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

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