Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5

Как создать БД с множеством вопросов для игры

05.10.2012, 11:16. Показов 5085. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Скорее всего нубский вопрос, но не могу ничего поделать: из-за того, что тестовый серверв от MS у меня не хочет идти, самообучение СУБД получается не очень. Пишу игру наподобие "кто хочет стать миллионером". Имеется класс "вопрос". Собственно, задача: создать БД с множеством этих вопросов. Вот так выглядит класс вопроса
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
namespace Millioner
{
    class Question
    {
        private readonly string _question;
        private readonly string[] _variantes = new string[4];
        private readonly int _rightVariant;
        public byte Level { get; private set; }
 
        public Question(string question, string[] variantes, int rightVariant,byte level)
        {
            _question = question;
            _variantes = variantes;
            _rightVariant = rightVariant;
            Level = level;
        }
 
        public string Get()
        {
            return _question;
        }
 
        public string[] GetVariantes()
        {
            return _variantes;
        }
 
        public bool IsRight(string answer)
        {
            return answer == _variantes[_rightVariant];
        }
    }
}
Подскажите, пожалуйста, как сделать)
Бд подойдет MS SQL или MySQL
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.10.2012, 11:16
Ответы с готовыми решениями:

Как создать приложение с множеством панелей?
Здравствуйте, я раньше программировал в основном в eclipse на java на начинающем уровне так сказать. Сейчас знакомлюсь с visual studio, с...

Как создать ландшафт для игры?
Хочу создать ландшафт для игры, может кто подскажет как лучше это сделать?

Как создать чит для игры?
Всем привет. Я хотел спросить как создать трейнер на C#. При запуске эта программа должна проверять запущен ли процесс с игрой и изменять...

30
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.10.2012, 23:25  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от I2um1 Посмотреть сообщение
При повторном запуске старая база данных не затирается. В этом можно убедиться, применив метод Count к существующим таблицам.
эт я уже понял еще днем, Когдау меня внезапно в базе вместо 4 записей оказалось больше 40 (после нескольких запусков) Но все равно спасибо
Цитата Сообщение от I2um1 Посмотреть сообщение
В некоторых специальных случаях EF не инициализирует привязанные таблицы (в данном случае - это поле Answers) и ей надо помогать методом Include у таблицы вопросов. Это поле не инициализируется с целью экономии ресурсов. При первом запуске поле не равно null и из-за того, что EF "закешировал" данные.
Супер, решил сделать тестовое задание элементарное - и тут специальный случай И как это сделать, можно пример?
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
06.10.2012, 23:32
Как использовать лямду в методе Include:
C#
1
2
3
using System.Data.Entity;
...
var question = context.Questions.Include(x => x.AnswerSet).FirstOrDefault();
Но в данном случае это не нужно. Так как ошибка в другом:
C#
1
public string[] Answers { get; set; }
EF не умеет маппить массивы. Вообще массивы в базе данных не используются, так как не нужны: используется та самая связь 1 ко многим.
Советую все же разобраться с Server Explorer: добавить сгенерированную базу данных в проект и два раза по ней клацнуть.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.10.2012, 01:00  [ТС]
I2um1, ясно, придется писать Answer1,Answer2...
Советую все же разобраться с Server Explorer: добавить сгенерированную базу данных в проект и два раза по ней клацнуть.
Можно еще раз, для особо одаренных? Пока что вы очень хорошо все прояснили)
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
07.10.2012, 09:41
Чтобы открыть Server Explorer, необходимо нажать CTRL+ALT+S или ALT+V, ALT+V.
Для установки подключения к базе данных, необходимо два раза по ней клацнуть в обозревателе решения, тогда это подключение появится в Server Explorer.
В итоге получится:

Далее заходим в папку Tables, выбираем нужную таблицу и два раза клацаем по ней или из контекстного меню Open Table Definition.
Появится вверху схема таблицы, которую можно редактировать, а внизу запрос, который ее создает.
Как видно, в таблице AnswerSetBases нет колонки Answers.

А выбрав в контекстом меню Show Table Data, можно глянуть сожержимое базы данных. Так же содержимое можно изменять и дополнять.

Касательно навигационного поля в таблице Question:
C#
1
public virtual AnswerSetBase AnswerSet { get; set; }

Как видно, хоть и привязывается целая сущность, но в базе данных хранится только ее Id.
Поэтому:
Цитата Сообщение от Psilon Посмотреть сообщение
придется писать Answer1,Answer2
Чтобы этого избежать, необходимо было определить только сущности вопрос и ответ и установить правильные связи между ними, что и было продемонстрировано в самом первом моем посте.

Заодно можно глянуть какие соответствия типов получаются между БД и кодом C# с помощью Server Explorer и не нужны никакие менеджмент студии.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.10.2012, 23:53  [ТС]
Таблицы создал, вопрос только такой:
1) Можно ли базу сохранить в какой-либо файл, чтобы потом с ним работать (грубо говоря, сериализовать, чтобы на любом компьютере можно было работать, доставая данные из локальной базы).
2) Как эти 2 таблицы в общем-то связать (я видел, что вы там создали внешний ключ, но у меня почему-то не получается
3) Как с этим работать в программе (как подключаться и доставать данные)?
Вот таблицы, которые я сделал (может в ней тоже косяки есть?).

Я написал так
SQL
1
CONSTRAINT [FK_Questions_To_AnswerSets] FOREIGN KEY ([Id]) REFERENCES [dbo].[AnswerSets]([Id])
Но не знаю, правильно или нет...

К тому же у меня база dbo, а у вас - mdf, при этом он мне не дает никаких вариантов (или я слепой?..)
Миниатюры
Как создать БД с множеством вопросов для игры   Как создать БД с множеством вопросов для игры  
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
08.10.2012, 18:36
1. Сохранить базу данных можно в файл, пробежавшись по всем записям и записав каждую в файл. Но это не будет называться локальной базой данных. В случае с MsSql нужен Sql Server, а если использовать MsSql CE, MySql, SQLite или что-то подобное, то достаточно вместе с исполняемым файлом таскать пару библиотек.
2. Связи создаются с помощью объявления навигационных полей. В соответствии с тем, каким именно образом объявлено навигационное поле - создаются связи в базе данных.
Приведу пример для двусторонних связей. К примеру есть две таблицы A и B.
- Если необходимо реализовать между этими таблицами связь 1-к-1 - в таблице A будет Id таблицы B, а в таблице B - Id таблицы A:
код
C#
1
2
3
4
5
6
7
8
9
10
11
class A
{
    public int Id { get; set; }
    public virtual B Link2B { get; set; }
}
 
class B
{
    public int Id { get; set; }
    public virtual A Link2A { get; set; }
}

- Если необходимо реализовать между этими таблицами связь 1-к-многим - к примеру, в таблице A будет множество значений B, то:
код
C#
1
2
3
4
5
6
7
8
9
10
11
class A
{
    public int Id { get; set; }
    public virtual ICollection<B> BSet { get; set; }
}
 
class B
{
    public int Id { get; set; }
    public virtual A Link2A { get; set; }
}

Таким образом таблица B будет содержать Id таблицы A, а таблица А - только свой Id и ничего более.
- Если необходимо реализовать связь много-ко-многим (в A содержится множество B и в B содержится множество A), то:
код
C#
1
2
3
4
5
6
7
8
9
10
11
class A
{
    public int Id { get; set; }
    public virtual ICollection<B> BSet { get; set; }
}
 
class B
{
    public int Id { get; set; }
    public virtual ICollection<A> ASet { get; set; }
}

EF создаст вспомогательную таблицу AB, которая будет содержать один Id таблицы A и один Id таблицы B, а в таблицах A и B будет по одному Id таблицы AB.

3. Чтобы подключится к базе данных, достаточно создать класс-контекст (в моем примере это DataContext) и правильно задать строку подключения, а доставать данные можно с помощью методов Linq. Чтобы получить один элемент, необходимо использовать метод Find.

Цитата Сообщение от Psilon Посмотреть сообщение
Я написал так
Но не знаю, правильно или нет...
Не правильно, в таблице Questions нет одной колонки - ссылки на таблицу AnswerSets (точнее не ссылки, а Id), которую и нужно указать как Foreign Key. В принципе, в базе данных не обязательно таблицы должны быть связаны, если это не критично - просто тогда СУБД не будет контролировать валидность указанных Id для связей таблиц (можно задавать будет Id на не существующую запись).

DBO - это Database Owner - пользователь с самыми высокими правами. MDF - расширение базы данных MsSql, хотя это еще может быть много чего. Даже если поменять расширение MDF на что-либо еще, СУБД сможет открыть этот файл.

Цитата Сообщение от Psilon Посмотреть сообщение
при этом он мне не дает никаких вариантов
По умолчанию, в Visual Studio можно создать базы данных всего двух типов: локальная (MsSql CE с расширением sdf) и сервис-ориентированная (MsSql с расширением mdf). В противном случае необходимо ставить расширения для Visual Studio или создавать базу данных другими инструментами, так же необходимы соответствующие библиотеки для различных манипуляций с этими базами данных.

А вообще, следуя стратегии Code First - в базу данных лезть нет необходимости, а тестовый данные можно создавать с помощью конфигурационного класса миграций.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2012, 18:49  [ТС]
I2um1, я думал связь будет id-id, Т.к. все равно один-к-одному. Вопрос насчет таблицы: вот я её заполнил ,как мне в члены класса их выгружать, не понятно все-таки. С EF вроде разобрался, а вот с такой работой - нет.Если конечно не окончательно еще достал. Если окончательно - то прервемся, я буду еще матчасть искать. )
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
08.10.2012, 18:52
Цитата Сообщение от I2um1 Посмотреть сообщение
а в таблицах A и B будет по одному Id таблицы AB
На счет этого я только ошибся. В таблицах A и B будут только их Id. А вообще - это специфическая связь и потому редко используется.
Цитата Сообщение от Psilon Посмотреть сообщение
я буду еще матчасть искать
Ее в интернетах навалом, если искать для ASP.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2012, 18:57  [ТС]
На счет этого я только ошибся. В таблицах A и B будут только их Id.
Ну так я это и хотел сделать: 1к1 связь. Разве нет?..
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
08.10.2012, 19:42
Цитата Сообщение от Psilon Посмотреть сообщение
Ну так я это и хотел сделать: 1к1 связь.
Это связь много ко многим: много сущностей A в сущности B и много сущностей B в сущности A.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.10.2012, 23:09  [ТС]
I2um1, тогда уж один ко многим: один вопрос- много овтетов. Но каждый ответ соответствует своему вопросу. Ладно, понял, спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2012, 23:09

Есть форма со множеством полей ввода. Как создать объект?
Пишу приложение о банках Есть меню, где можно выбрать добавить банк. Класс должен содержать стандартные методы для установки и показа...

Как создать окружающую среду для 3D игры
Вообщем, пишу игру на С++/SFML/OpenGL. Такой вопрос, как нарисовать окружающую среду? Не с помощью там каких то height map, а самому. Пишу...

Как создать и работать с сервером для игры
Начал делать двухмерную игру на OpenGL, всё идёт отлично. Проблема в том что я не знаю как сделать для игры сервер и передавать данные...

Как правильно создать систему уведомлений для браузерной игры\сайта?
Всем привет! Недавно начал заниматься веб программированием, есть некие начальные знания в PHP/JS/HTML/CSS, для более интересного...

Создать список вопросов для выяснения функциональностей системы
Создать список вопросов для выяснения функциональностей системы


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru