Master of Orion
|
||||||
1 | ||||||
Как создать БД с множеством вопросов для игры05.10.2012, 11:16. Показов 4242. Ответов 30
Метки нет (Все метки)
Здравствуйте. Скорее всего нубский вопрос, но не могу ничего поделать: из-за того, что тестовый серверв от MS у меня не хочет идти, самообучение СУБД получается не очень. Пишу игру наподобие "кто хочет стать миллионером". Имеется класс "вопрос". Собственно, задача: создать БД с множеством этих вопросов. Вот так выглядит класс вопроса
Бд подойдет MS SQL или MySQL
0
|
05.10.2012, 11:16 | |
Ответы с готовыми решениями:
30
Как создать приложение с множеством панелей? Как создать ландшафт для игры? Как создать чит для игры? Есть форма со множеством полей ввода. Как создать объект? |
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
|
|
05.10.2012, 12:34 | 2 |
по-моему, принципы работы с бд везде примерно одинаковы? не знаешь как создать таблицы-связи-ключи? а то я никак не въеду в суть вопроса
0
|
Master of Orion
|
||||||
05.10.2012, 18:39 [ТС] | 3 | |||||
Монфрид,
Добавлено через 5 часов 25 минут Я так понимаю, что вопрос настолько дурацкий, что всем влом отвечать, но я бы не стал его задавать, предварительно не воспользовавшись книжками/msdn/гуглом/мозгом Добавлено через 12 минут Только вот такую статью нашел, пытаюсь на свой случай приспособить: Программное создание базы данных Только там так неотвеченно и осталось... Добавлено через 12 минут Смысл в том, что мне не нужно привязываться к датагриду и прочему. Я хочу в БД хранить список вопросов, после этого во время игры я посылаю запрос на получение случайной записи нужного уровня сложности. То есть я могу получить все записи
0
|
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
|
|
05.10.2012, 18:52 | 4 |
тебе linq подойдёт. Хотя раз с бд у тебя проблемы, я не знаю насколько ты знаком с этой технологией. Возможно, вечером приду и что нить напишу тебе. А для чего тебе программно создавать бд? В смысле что так больше проблем..
0
|
Master of Orion
|
||||||
05.10.2012, 18:58 [ТС] | 5 | |||||
Монфрид, в том смысле, что managment studio у меня не идет, остается только программное создание. С linq у меня все порядке.
на linq'е я бы так написал
0
|
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
|
|
05.10.2012, 19:08 | 6 |
можно access и entity framework
0
|
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
|
|
05.10.2012, 20:08 | 8 |
если у тебя MS стоит, то ты можешь создать бд локально и потом сгенерить классы EF
1
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
||||||||||||||||||||||||||
06.10.2012, 15:07 | 10 | |||||||||||||||||||||||||
Пример POCO и стратегии Code First на новом Entity Framework в 2012 студии.
1. Создаем консольное приложение с именем ConsoleApplication. 2. Создаем класс Answer: Класс Answer
Стоит заметить, что Id - автоинкрементное поле и ключ в базе данных - EF сам это понимает, если следовать его нотации: Id или <ClassName>Id. Однако, если имя необходимо задать другое, то может помочь атрибут Key перед свойством. Это упрощенная, односторонняя связь сущностей, т.е. с Answer нельзя получить доступ к Question, в противном случае необходимо добавлять навигационное поле. (Один ответ может содержаться как в только одном вопросе, так и в нескольких - все зависит от ТЗ) 3. Создаем класс Question: Question
RightAnswer и Answers - это навигационные поля. А модификатор virtual нужен для поддержки Lazy Loading в EF. 4. В References добавляем ссылку на EntityFramework (если нет такого, то используем Manage NuGet Packages или Package Manager Console). 5. Создаем самый важный класс, который будет выполнять функции ORM: Класс DataContext
6. Последний штрих. Создаем App.Config (если нет) и добавляем строку подключения: Конфигурационный файл
Очень важно, чтобы название строки подключения совпадало с классом, описанным в пункте 5. В принципе, базу данных можно использовать любую - хоть MsSql, хоть MySql, да тот же FireBird при желании. Главное правильно задать connectionString, providerName и установить правильный коннектор (для MsSql установлен по умолчанию). 7. Пишем тестовое приложение: Основная программа
Пару слов о DataDirectory: это такая папка, где находятся базы данных приложения. В случае с консольным приложением ее необходимо явно задавать через AppDomain. Все операции (CRUD - create, read, update, delete) с базой данных отложены (применяется транзакция). Для их выполнения необходимо вызвать метод SaveChanges, а перед этим операции только регистрируются в контексте. К слову, это самый приятный способ из всех, который я когда-либо знал/использовал: мало кода, не надо ручками лезть в БД, можно использовать божественный Linq, создание БД и таблиц на лету. А если добавить еще поддержку миграций, так вообще сказка. Так же возможна реализация с помощью ADO.NET, но он у меня вызывает попа-боль и если не обдуманно его использовать, то приложение не будет защищено от SQL-инъекций. А вот к Linq2Sql у меня нейтральное чувство.
1
|
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
|
|
06.10.2012, 16:17 | 11 |
вот я сделал бд, может, немного неправильна структура. Наваял приложение, увлёкся и реализовал даже переход между вопросами)Tester.rar
Создать локальную бд можно так: после создания бд, можно генерировать классы EF:
1
|
Master of Orion
|
||||||
06.10.2012, 19:13 [ТС] | 12 | |||||
I2um1, 2 вопроса: можно ли создать БД с полями вопрос-ответ? Потому что вопрос-ответ связь 1 к 1 (1 вопрос только к 1 ответу подходит), то есть что-то вроде такого
Второе: вы говорите, что это для консольного приложения верно, а на wpf будет сильно отличаться?.. Добавлено через 39 минут Просто я немного плохо понимаю, ведь отношение будет 1к1 (первый вопрос- первый ответ, второй вопрос - второй ответ). Поэтому логично инкапсулировать это в одном объекте вопрос-ответ. А тут как он будет связь устанавливать? В акцессе чуток работал, как там это делается знаю, а тут - нет
0
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
|
06.10.2012, 20:27 | 13 |
Конечно можно. Можно делать все, что душе угодно, но с оговорками:
- Во-первых, не есть хорошо делать не нормализированную базу данных - считается плохим тоном. К примеру база данных из одной таблицы с 50-ю колонками - это все равно, что написать на C# один класс с 50 свойствами, в котором будет имя пользователя, адрес, паспортные данные, много чего еще, а не кучу мелких классов. Дублирование хранимой информации не избежать. - В базе данных можно хранить только примитивные типы: целое, вещественное, строка, время, дата и т.п.. В некоторых есть поддержка Guid, blob (это массивом байтов можно считать, используется, к примеру, для хранения изображения в БД). А объект типа Question или Answer хранить можно только в виде таблиц. Как я себе это понимал? Если брать за основу игру "Кто хочет стать миллионером", то у одного вопроса есть 4 вариантов ответа, из которых один правильный. Что я собственно и реализовал в примере ранее. Т.е. это пример, в котором есть связь один (вопрос) ко многим (вариантов ответа) и связь один (вопрос) к одному (правильный ответ). В принципе, ничего не мешает удалить навигационное поле Answers, а поля с Answer (в данном случае только Text) перенести в Question, но тогда база данных будет не нормализирована - дублирование данных. Т.е., если я правильно понял, то: Абсолютно все равно какое UI. Консольное приложение взято за основу, так как ничего проще нет. Можно и нужно слой работы с данными (Data Access Layer) выделять в библиотеку и подключать к нужному клиенту, будь-то Console, WinForms, Wpf, Xna, что-угодно. На ASP же некоторое вещи писать не надо или только немного подредактировать. В плане мобильных устройств не знаю, вроде EF совместим с облегченной версией .NET Framework без особых танцев с бубном. Да смысл тот же. Я же не знаю насчет того, что должно быть.
1
|
Master of Orion
|
||||||
06.10.2012, 20:54 [ТС] | 14 | |||||
I2um1, огромное вам спасибо за помощь. Если не возражаете, я буду к вам обращаться
Насчет написания отдельной библиотеки: я правильно понял, что лучше всего написать все в консольном приложении, протестировать, а потом как dll-ку подсоединить к wpf? Я понимаю, что вы (и товарищ Монофрид) тоже проделали огромную работу, да и стена текста с объяснениями внушает уважение, но я пока плохо понимаю, как эта БД устроена. У нас есть "ответ", у него есть собственно айдишник и текст. Есть вопрос: у него есть поле "правильный ответ", множество возможных ответов, сам вопрос и его айдишник. Структура данных понятна. А вот структура связей - нет. Понимаю, что полный наглеж, но очень хочу разобраться, а вы на удивление разумный человек, очень приятно общаться, поняли вопрос и максимально подробно его расписали. Жалко, я не могу сразу все понять, но я обещаю стараться, если вы мне поможете) И насчет DataDirectory, я попробовал изменить путь на
И еще: чтобы совсем тупыми вопросами вас не грузить: что можно почитать про БД в принципе? А то я качал и книжки из рекомендованных, и методички разные, они все связанны с программированием БД в managment studio и последующих подключениях в явном виде типа "SELECT * FROM table", собственно что меня не очень устраивает. Насчет дублирования данных, я думал будет так 1 | Вопрос1 | Ответы1 | Номер_правильного_ответа1 | Уровень_сложности_вопроса1 2 | Вопрос2 | Ответы2 | Номер_правильного_ответа2 | Уровень_сложности_вопроса2 ... 1 Ответы1 ответ11 ответ12 ответ13 ответ14 2 Ответы2 ответ21 ответ22 ответ23 ответ24 ... Примерно так я себе это представляю:
0
|
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
|
|
06.10.2012, 21:00 | 15 |
если сроки не жмут, то пробуй с более простых примеров разбираться с бд. Помнится, ничего специализированного и фундаментального не читал по бд, учился на своих ошибках, постепенно наращивая сложность
1
|
Master of Orion
|
|
06.10.2012, 21:03 [ТС] | 16 |
Монфрид, сроки 3 недели, за это время можно новый ЯП изучить, но у меня вот с бд, говорю, не сложилось настолько, что я даже не смог научиться. Потому что любой пример начинался или с "зайдем в managment studio и создадим БД" (у меня она не ставится и в инете я её найти так и не смог), либо "давайте запустим из приложения нашу базу данных, которую мы создали в п.1"... У меня даже майкросовтофская БД тестовая (не помню название, northwind кажется) не пошла (скачал тестовую базу, скопировал пример с msdn, она выдавала ошибку).
С другой стороны, номер правильного ответа лучше вставить в таблицу "ответы" и тогда получается как-то так
0
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
||||||
06.10.2012, 21:42 | 17 | |||||
Можно и так, если так будет проще. Просто мне все равно на чем тестировать.
Если говорить проще, то база данных - это заполненные таблицы с колонками и связи между таблицами (1-к-1, 1-к-многим). Для Sql сервера Express-версии и простых приложений ничего более знать и не надо, хотя дополнительные знания и помогают оптимизировать работу СУБД. (Процедуры, функции, триггеры, индексы, словари, полнотекстовый поиск...) Можно реализовать и так, как на прикрепленном изображении, если удобнее:
Вероятнее всего из-за того, что данная папка не создана - при построении проекта, эта папка не создается. А соединять части пути лучше с помощью метода Path.Combine. Лично я читаю блоги: кратко, ужата, в виде обзора описывают одной статьей основные моменты того или другого приема. Да и предметов, связанных с базами данных, у меня было три семестра. Дублирование есть, попробую объяснить на простом примере (хотя в принципе пока можете не заморачиваться со всякими нормализациями):
1
|
Master of Orion
|
|||||||||||
06.10.2012, 22:27 [ТС] | 18 | ||||||||||
Не могу понять, в чем дело, ругается на то, что нету конструктора без параметров. Посмотрите, пожалуйста:
0
|
Master of Orion
|
||||||||||||||||
06.10.2012, 22:52 [ТС] | 19 | |||||||||||||||
Попробовал везде убрать конструктор и заменить его на object initializer и записать так, как у вас:
Добавлено через 18 минут Э нет, все-таки проблемы имеются. При первом запуске все в порядке, однако при повторном добавлении в базу имеющихся записей почему-то вылетает nullreference, в отладчике видно, что при втором проходе question.AnswerSet.Answers == null, почему так? И поле Id всегда равно единицы и не автоинкрементируется. Классы элементов таблиц
1
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
|
06.10.2012, 23:23 | 20 |
При повторном запуске старая база данных не затирается. В этом можно убедиться, применив метод Count к существующим таблицам.
В некоторых специальных случаях EF не инициализирует привязанные таблицы (в данном случае - это поле Answers) и ей надо помогать методом Include у таблицы вопросов. Это поле не инициализируется с целью экономии ресурсов. При первом запуске поле не равно null и из-за того, что EF "закешировал" данные.
1
|
06.10.2012, 23:23 | |
06.10.2012, 23:23 | |
Помогаю со студенческими работами здесь
20
Как создать окружающую среду для 3D игры Как создать и работать с сервером для игры Как правильно создать систему уведомлений для браузерной игры\сайта? Создать список вопросов для выяснения функциональностей системы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |