Почему типизированные методы DataSet возвращают неожиданные результаты

Я использую typed DataSets для доступа к данным, их настройки через DataSet Designer (общая идея объясняется в этом уроке).

Для каждого стола GetData() Метод автоматически создается вначале. Возвращает DataTable иметь ту же схему (т.е. столбцы), что и базовая таблица в базе данных. Если сейчас я создаю собственный метод, используя 'Add query' В опции, которая должна возвращать только часть данных (скажем, три столбца из шести), DataTable, возвращаемый автоматически сгенерированным методом, по-прежнему состоит из шести столбцов, а три из них не содержат данных.

Это имеет раздражающий побочный эффект, когда я связываю это DataTable например, для GridView (очевидно, с использованием ObjectDataSource), эти пустые столбцы появляются в GridView так что я должен удалить их вручную.

Другая связанная проблема заключается в том, что, если я добавлю к соответствующему SQL-query столбцы с данными из другой таблицы (например, с использованием внутренних объединений или подзапросов), напротив, эти столбцы не добавляются в GridView, хотя я могу связать их вручную в Boundfield,

Поэтому, если здесь присутствует кто-то, кто еще не полностью перешел на Entity Framework и может объяснить это поведение и помочь преодолеть эти проблемы, я был бы очень признателен за ваш ответ. Заранее спасибо.

ОБНОВИТЬ:

Я ожидаю найти способ получить DataTable из метода get, созданного DataSet Designer ontop моего SQL-запроса, который будет отражать результаты этого запроса в его схеме. В уроке они говорят, что GetData() Метод создает и заполняет DataTable для вас и возвращает его как возвращаемое значение метода. Так что интуитивно, почему бы не создать новую таблицу с соответствующими полями.

Так что я надеялся, что делаю что-то не так. Или мои ожидания были неправильными, но тогда кто-то мог объяснить мне, почему.

2 ответа

Решение

Хорошо, я могу сказать, что я нашел, как решить это.

Объяснение состоит в том, что соответствующий TableAdapter создает и возвращает любым из своих методов GetData() (включая настраиваемые методы, такие как GetReducedSetOfData()) не просто универсальный DataTable, но точно типизированный DataTable (например, CarSetsDataTable в моем случае). Возможно, в этом и была суть строго типизированных наборов данных, которые я пропустил.

И решение легко на мой взгляд. Вам нужно просто не создавать новые пользовательские методы с, вероятно, измененной схемой данных в качестве возвращаемого значения в существующем адаптере данных, но создавать другие адаптеры данных для той же таблицы БД, которые будут возвращать точно результат другого пользовательского SQL-запроса, который вам нужен методы GetData() по умолчанию.

Я не знаю, может ли создание многих адаптеров данных иметь какие-либо побочные эффекты, но, похоже, это безопасный способ получить именно те данные, которые вам нужны, из типизированного набора данных с минимальными усилиями.

Я не пробовал этого, но я полагаю, что вы можете решить эти проблемы, перенеся результаты таблицы данных в другой известный тип и соответствующим образом связав таблицу. (Я знаю, что это мало смысла, терпеть меня...)

Как пример (хотя и с нетипизированным набором данных):

РЕДАКТИРОВАТЬ - переключился на 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, но вы можете легко это расширить).

надеюсь, это поможет

Другие вопросы по тегам