Створення відносин між таблицями в Visual C # (Sharp)

Першим кроком у використанні Dataset Designer буде перетворити таблиці в Database Explorer в формат, з яким Dataset Designer може працювати Для цього в Solution Explorer двічі клацніть по файлу з розширенням xsd в нашому прерії це буде файл lotteryDataSetxsd Файл з розширенням xsd – це файл XML Schema Definition (визначення схеми XML), який перетворює набори даних бази даних у файли XML

Файл lotteryDataSetxsd має кілька дочірніх файлів, які можна відкрити і переглянути їх зміст Ці файли є частиною колекції, використовуючи Dataset Designer Але з усіх цих файлів модифікувати можна тільки файл lotteryDataSetcs Всі інші файли управляються Dataset Designer

Ми хочемо створити відносини між трьома таблицями Важливість відносин полягає в тому, що вони дозволяють нам підтримувати несуперечливість бази даних Як приклад ситуації, яких ми хочемо уникнути, уявіть додавання власника лотерейного квитка в таблицю winners для розіграшу, якого не було За допомогою відносин ми можемо виконувати примусову перевірку на несуперечність, таким чином, вимагаючи, щоб в базі даних існував запис для розіграшу з певною датою, перш ніж можна додавати володіли виграли квитків для цієї дати Визначимо два відносини: між таблици winners і draws і між таблицями winners і persons Не забувайте, що табла winners містить перехресні посилання між таблицями persons і draws

Для визначення відносин, виконайте наступні операції:

1 Двічі клацніть файл lotteryDataSetxsd в Solution Explorer Буде виведено повідомлення (рис 1410), що дає нам знати, що Dataset Designer не має даних для виводу

2 Перетягніть кожну з раніше створених таблиць з Database Explorer в Dataset Designer (рис 1411) Це автоматично додасть стандартну підтримку для цих трьох таблиць

Рис 1410 Dataset Designer не має даних для виведення

Рис 1411 Приміщення таблиць в Dataset Designer

Рис 1412 Створення відносини між таблицями winners і persons

3 Щоб створити ставлення, клацніть правою кнопкою миші по поверхні гератора даних і в контекстному меню виберіть послідовниками команд Add | Relation Буде виведено діалогове вікно Relation,  з пощью якого можна асоціювати дві таблиці за допомогою спеціального поля

4 Вкажіть таблицю winners в якості батьківської таблиці, а таблицю persons – в якості дочірньої Таблиці звязуються по стовпці id Натисніть кнопку ОК, щоб створити ставлення

Відношення між таблицями winners і draws визначається так само, як і ставлюся між таблицями winners І persons, ТІЛЬКИ звязуються стовпці draw_date (рис 1413)

Рис 1413 Створення відносини між таблицями winners і draws

Після створення відносин вікно Dataset Designer має виглядати так, як поки що на рис 1414

На рис 1414 відображена чітка структура бази даних, що включає відносини Структура відіграє важливу роль для Dataset Designer, т к вона визначає формат автоматично генерованого коду Подивіться уважно на рис 1414 і обріте увагу на напис Fiil, GetData () внизу подання кожної таблиці Методи Fill про і GetData () застосовуються для отримання даних з бази даних і перетворення їх в дані, з якими може працювати мову С #

Рис 1414 Dataset Designer після створення відносин між таблицями

Рис 1415 Властивості структури таблиці в Dataset Designer

Есл і клацнуть ь миша ю п про текст уF i n промул іGetDatao ,  т о Datase t Designe r виве – де т панелі д ь свойст в (рис 1415)

У властивості х показу н точні й синтакси с дл я коман д SQ L INSERT І SELECT Ка до ми памятаємо, пов і дв а оператор а застосовуються тільки я дл я додану я і витяг я данни х и з табли ц ба з даних Ет про показує, чт про ко д Datase t Designe r ниче м н е отлічаетс я про т код а ADONET

Тепер ь розглянь м код, згенерованих ї Datase t Designe r дл я привязки і шпальт в таблиці и draws до згенеровані ї структур е даних

private void InitAdapter() {

this ^adapter – new global::SystemDataSqlServerCeSqlCeDataAdapter() global::SystemDataCommonDataTableMapping tableMapping =

new global: :SystemDataCommonDataTableMapping() tableMappingSourceTable = &quotTable" tableMappingDataSetTable = &quotdraws" tableMappingColumnMappings Add(,,draw_date&quot, &quotdraw_date&quot)

tableMapping ColumnMappings Add (&quot first_number&quot, &quot first_number&quot)

tableMappingColumnMappings Add{ &quotsecond_number&quot, &quotsecond_number&quot) tableMapping ColumnMappings Add (&quot third_number11, &quot th-ird_number&quot)

tableMappingColumnMappingsAdd(&quotfourth_number&quot,  &quotfourth_number&quot) tableMappingColumnMappingsAdd(&quotfifth_number&quot,  &quotfifth_number&quot) tableMappingColumnMappingsAdd(&quotsixth_number&quot,  &quotsixth_number&quot) tableMappingColumnMappingsAdd(&quotbonus&quot,  &quotbonus&quot) this_adapterTableMappingsAdd(tableMapping) this„adapterInsertCommand =

new global:: System Data SqlServerCe SqlCeCcomand () this_adapterlnsertCanmandConnection = thisConnection thie_adapterIneertCaninandComnandText =

&quotINSERT INTO [draws] ([draw_date], [first_nuiriber], [second_number], [third_nuiriber]&quot +

[fourth_nuiriber], [fifth_nuiriber], [sixth_number], [bonus]) VALUES (@pl, @p2, @p&quot +

&quot3, @p4, @p5, @p6, 0p7,

this„adapter InsertConinandCoamtfmdType = global:: System Data CanmandType Text

global:: System Data SqlServerCe SqlCeParameter par am = new global::SystemDataSqlServerCeSqlCeParameter()

param PararrveterNarrve = &quot@pi"

par amDbType = global::SystemDataDbTypeDateTime param IsNullable = true

paramSourceColumn = &quotdraw_date"

thi s „adapter InsertCcmnand Parameters Add (param)

param = new global::SystemDataSqlServerCeSqlCeParameter() param ParameterName = &quot&ltap2"

param DbType = global::System DataDbTypeInt32 param IsNullable = true

paramSourceColumn = &quotfirst_nuiriber"

thi s „adapter insertconmand Parameters Add (param)

param = new global::SystemDataSqlServerCeSqlCeParameter() paramParametezName = &quot@p3"

param DbType = global::SystemDataDbTypeInt32 param IsNullable = true

paramSourceColumn = &quotsecond_number"

Виділений жирним шрифтом код показує, наскільки близьким є сгерірованний код до версії коду, використовуваного для додавання даних в розділі на ADONET Згенерований код більш ясний і докладний, ніж попередній код, але це не має значення, т к розробник не повинен редагувати сгенерованний код, а користуватися Dataset Designer

ПРИМІТКА

Одна з переваг Dataset Designer полягає в тому, що нам не потрібно предостаять звязку між С # і базою даних Крім цього, Dataset Designer дозволяє з Леост здійснювати звязування користувацького інтерфейсу з базою даних Dataset Designer генерує такий код ADO, який би був написаний вручну разротчіком Але, надаючи графічний інтерфейс користувача, Dataset Designer набагато спрощує завдання написання коду

Использовани е коду, сгенерірованног про Datase t Designer, н е представляе т никаки х пробле м пр і умови, чт про в и знаєте, чт про в НЕ м відбувається Datase t Designe r гені – ріруе т дв а важливі х фрагмент а коду: Адапті р табли ц і набо р даних Адапті р таб – Чи ц представляе т собо ї код, використовувані ї дл я прямог про взаємодію я з табли – цею: дл я додавання , Вибірка і і видаленням я записів Пр і вибірку е даних, даних д е заповнюю т набо р даних

Дале е пріводітс я ко д дл я вставленими я запис і в таблиць у draws (ко д находітс я

У приложени і DatabaseConsoleEx): DatabaseConsoleExlotteryDataSetTableAdaptersdrawsTableAdapter table =

new  DatabaseConsoleExlotteryDataSetTableAdaptersdrawsTableAdapter()

tableInsert(DateTimeNow, 2, 2, 2, 2, 2, 2, 2)

Ко д н е представляе т собо ї що нічого про складного В не м создаетс я примірниках р drawsTableAdapter, остан е чег про визиваетс я мето д insert про, щоб и додасть ь за – пись Подключени е до баз е даних, виконань е команд и і присвоювання е парамет – ро в виполняетс я автоматично

ПРИМІТКА

Автоматично генерований код є і добром, і злом одночасно Добром тому, що він приховує складності і полегшує вашу роботу Але, як було показано у фрагментах коду, досить багато роботи виконується за лаштунками, і якщо ви не розумієте ADONET, то не будете знати, що робити, коли щось піде не так Наприклад, коли виконується підключення до бази даних Єдиним способом дізнатися це буде розібратися з автоматично згенерованих кодом і простежити виклики ADONET Поступово таким чином, ми дізнаємося, що підключення до бази даних відбувається при першому виклику методу SQL (наприклад, методу inser t О), а не при ініціалізації адаптера

Дл я витяг я в цикл е записами й і з таблиць и можн про іспользоват ь следующи ї код:

DatabaseConsoleExlotteryDataSet dataset = new DatabaseConsoleExlotteryDataSet()

DatabaseConsoleExlotteryDataSetTableAdaptersdrawsTableAdapter table = new  DatabaseConsoleExlotteryDataSetTableAdaptersdrawsTableAdapter()

int count = tableFill(datasetdraws)

ConsoleWriteLine(&quotRecord count is (&quot + datasetdrawsCount + &quot)(&quot + count + &quot) &quot)

foreach (DatabaseConsoleExlotteryDataSetdrawsRow row in datasetdraws) {

ConsoleWriteLine(&quotDate (&quot + rowdraw_date + &quot) (&quot +

row first_number + &quot)&quot)

}

Мінлива table инициализируется адаптером, який підключається до таблиці

draws Мінлива dataset є марною колекцією для таблиці draws

Для заповнення колекції викликається метод tableFill (), а призначенням являея член даних dataset draws Після виклику методу Fill про зчитується колічтво записів і присвоюється змінної count

Для обробки в циклі окремих рядків таблиці застосовується оператор циклу foreach Він звертається до типу drawsRow і кожен екземпляр даного типу має член даних, який представляє стовпці draw_date, f irst_number та ін Обротка в циклі окремих рядків таблиці схожа на обробку в циклі колекції У прикладі ADONET використовувався цикл while і було потрібно знати, який стовпець асоціюється з яким полемSELECT

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*