Доступ ко многим данным таблицы только через одну таблицу (C# + SQL Server)

Несколько месяцев я пытался сделать приложение, используя Sql Server + C#. Программа является своего рода "Повесткой Покемонов", где пользователь может добавлять и редактировать покемонов и их способности, типы и фотографии, помимо других функций, таких как поиск записей. Вот экран печати из формы и из диаграммы таблиц:

Вот моя проблема: я пытался получить прямой доступ к именам из таблиц "Способности" и "Типы", используя только его идентификаторы (AbilityID и TypeID) из таблицы "Канто". Другими словами, я пытался получить доступ ко многим данным из разных таблиц, используя, в основном, одну таблицу! Однако я не уверен, что это возможно. Я думал в 2 возможностях:

  1. Использование отношений набора данных (хотя для меня это решение пока не слишком понятно), например:

    ds.Relations.Add ("PokéAbility", ds.Tables ["Ababilities"].Columns["AbilityID"], ds.Tables["Kanto"].Columns["AbilityID"]);

  2. Используя Natural Join, я мог создавать больше таблиц и использовать их для манипулирования желаемыми данными.

Примечание: таблицы "Типы" и "Способности" должны быть уже заполнены всей необходимой информацией, чтобы они не редактировались во время выполнения Формы.

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

3 ответа

Решение

Это должно создать консолидированное представление. Я не проверял SQL, поэтому может быть опечатка. Это должно начать вас. Вы должны понимать взгляды, а также присоединяется.

Create View Pokedata as
    Select name_,  t1.type as Type1, t2.type as Type2, ability
    From Kanto 
    inner Join Abilities on Kanto.abilityId = Abilities.abilityId
    inner join KantoType as kt1 on Kanto.pokémonid = kt1.pokémonid and kanto.typeid1 = kt1.typeid
    inner join on types as t1 on kt1.typeid = t1.typeid
    inner join KantoType as kt2 on Kanto.pokémonid = kt2.pokémonid and kanto.typeid2 = kt2.typeid
    inner join on types as t2 on kt2.typeid = t2.typeid

Это на самом деле не собирается отвечать на ваш вопрос, потому что это слишком расплывчато, чтобы давать какие-то конкретные советы, но я бы посоветовал вам взглянуть на ADO.NET Entity Framework. Используя Entity Framework, вы можете иметь классы, которые содержат объекты из других таблиц. Например (я предполагаю, что ваши данные здесь...)

public class Pokemon
{
int Id {get; set;}
ICollection<PokeAbility> Abilities {get; set;}
ICollection<PokeType> Types {get; set;}
}

В платформе Entity вы определяете класс контекста данных, например:

  public PokeContext : DbContext
    {
    DbSet<Pokemon> Kanto {get;set;}
    DbSet<PokeAbility> Abilies {get; set;}
    DbSet<PokeType> Types {get; set;}
    }

Тогда в вашей программе, если у вас есть объект Pokemon, вы можете просто получить доступ к данным из других таблиц, например, так:

var context = new PokeContext();
Pokemon instance = context.Kanto.First(); // Fetch first item from the Kanto table in the database
foreach (var ability in instance.Abilities)
  {
  Console.WriteLine(ability);  // Or whatever you want to do with it.
  }

Я бы посоветовал вам взглянуть на некоторые потоковые видео, выпущенные Microsoft вместе с Visual Studio 2012, например, на этот:
http://msdn.microsoft.com/en-us/data/jj193542
Здесь есть целая куча ресурсов:
http://msdn.microsoft.com/en-us/data/aa937723

Взгляните на использование SQL Server Views.

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