Почему типизированные методы DataSet возвращают неожиданные результаты - PullRequest
0 голосов
/ 06 июля 2011

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

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

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

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

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

UPDATE:

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

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

Ответы [ 2 ]

0 голосов
/ 06 июля 2011

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

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

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

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

0 голосов
/ 06 июля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...