Купить
 
 
Жанр: Учеба

Си шарп: создание приложений для windows

страница №19

виатуры.
СООБЩЕНИЯ КЛАВИАТУРЫ
Для обработки сообщений с клавиатуры в Windows Forms приложениях
предусмотрены три события: KeyUp, Keypress, KeyDown.
Событие KeyUp посылается при отпускании кнопки на клавиатуре.
Событие KeyPress посылается первый раз при нажатии кнопки на клавиатуре
вместе с событием KeyDown и затем может посылаться неограниченное
число раз, если пользователь удерживает клавишу в нажатом
состоянии. Частота посылки события KeyPress зависит от настроек операционной
системы. Событие KeyDown посылается при нажатии кнопки на
клавиатуре.
Для примера создадим приложение, которое будет обрабатывать нажатие
клавиш и выводить на экран информацию о том, какая клавиша
была нажата. Для этого создайте новое Windows Forms приложение с
именем KeyboardApp. Измените свойства вновь созданной формы:
• Text - "Информация о нажатых клавишах";
• KeyPreview - True.
Свойство Text задает заголовок окна. Свойство KeyPreview определяет
свойство, позволяющее форме улавливать сообщения клавиатуры от дочерних
элементов управления формы. Если свойство KeyPreview формы
устанавлено в False, то форма не будет получать сообщения от клавиатуры,
если активизирован один из элементов формы. Другими словами,
если на форме присутствует компонент TextBox и курсор мыши находится
в его поле, то при нажатии клавиши на клавиатуре форма об
этом узнать не сможет. Поэтому, если вы собираетесь обрабатывать
клавиатуру в классе формы, вам необходимо выставлять свойство
KeyPreview в true.
Добавьте на форму элемент управления TextBox.
Измените некоторые свойства элемента TextBox:
• Text - "";
• Readonly - True;
• TabStop - False.
Работа с клавиатурой 307
Форма должна выглядеть так, как показано
на рис. 30.1.
Добавьте в программу обработчик события
KeyDown. Для этого в окне свойств формы
г . ^. ^ щелкните два раза указателем мыши по соРис.
зод. Проектирование формы бытию KeyDown в окне свойств формы. В код
приложения KeyboardApp программы включится обработчик события
KeyDown с именем Forml_KeyDown. Добавьте к
обработчику код, представленный ниже:
private void Formi_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
// очищаем поле
textBoxi . Text •*• "" ;
// проверяем нажата ли клавиша Ctrl
// если да, то записаваем в поле слово Ctrl
if(e.Control)
{
textBoxl.Text f= "Ctrl+";
// проверяем нажата ли клавиша Shift
// если да, то записаваем в поле слово Shift
if (e.Shift)
{
textBoxl .Text += "Shift-*-";
)
// проверяем нажата ли клавиша Alt
// если да, то записаваем в поле слово Alt
if (e.Alt)
{
textBoxl.Text += "Alt+";
// копируем KeyData нажатой клавиши
Keys key = e . KeyData;
// извлекаем из данных о нажатой клавише
// коды системных кнопок, таких как
// Ctrl, Shift, Alt
key &= -Keys.Control;
key &= -Keys.Shift;
key &= ~Keys.Alt;
// выводим полученное словосочетание
textBoxl.Text += key.ToString();
308 Раздел I I I . Программирование для Windows
КЛАСС KeyEventArgs
Класс KeyEventArgs содержит всю информацию о нажатой клавише.

Вот свойства, которые обычно используются при обработке нажатия
кнопки:
Alt - True, если нажата клавиша Alt;
Control - True, если нажата клавиша Ctrl;
Shift -True, если нажата клавиша Shift;
KcyCode - код нажатой клавиши;
KeyData - совокупность кодов нажатых клавиш;
Key Value - десятичное значение свойства KeyData;
Handled - флаг, указывающий, было ли сообщение обработано. По
умолчанию, значение Handled равно false. Если вы не хотите дальнейшей
обработки нажатия кнопки, выставьте флаг Handled в true.
Для вывода на экран информации о нажатых управляющих клавишах
мы проверяем значения свойств Alt, Ctrl и Shift. Если одна из клавиш
нажата, то в поле TextBox добавляется соответствующее слово.
Для того чтобы вывести на экран информацию об основной нажатой
клавише, мы должны предварительно удалить из поля KeyData системную
информацию. Поэтому мы сбрасываем в 0 флаги управляющих клавиш
свойства KeyData1.
Инструкция key & = ~Keys.Control позволя•
IV: •. - - ет удалить из переменной key код управляющей
клавиши Ctrl независимо от того, есть
он там или нет. Точно так же удаляются коды
клавиш Alt и Shift.
Метод ToString возвращает словесное описаРис.
30.2. Информация о нажа- ш клавиши. КОД обычНОЙ КЛаВИШИ ВЫтых
клавишах тых клавишах " _,
водится одной буквой; код системной клавиши
выводится словом, соответствующим клавише.
Запустите программу. Попробуйте нажимать кнопки на клавиатуре,
сочетая их с управляющими клавишами. На экране будет отображаться
информация в виде строки, содержащей все нажатые клавиши (рис. 30.2).
1 Управляющие клавиши представлены битовыми значениями соответствующего
разряда. В общем случае, свойство KeyData состоит из объединения логическим
знаком ИЛИ кодов управляющих клавиш и кода основной клавиши. Если
вы хотите оставить в KeyData только код основной клавиши, то вам необходимо
удалить информацию о системных клавишах.
31. ТАЙМЕР И ВРЕМЯ
Очень часто приходится устанавливать зависимость выполнения каких-либо
действий в приложении от времени. Это может быть выполнение
периодически повторяющихся действий либо срабатывание команды
в определенный момент времени.
КОМПОНЕНТ Timer
Работа с таймером в Windows Forms приложениях основана на все том
же механизме событий. Вы устанавливаете таймер на определенную
частоту, и операционная система будет рассылать вашему приложению
события оповещения с указанной частотой.
Компонент Timer позволяет легко и просто работать со временем. Основными
свойствами компонента Timer являются:
• Interval - задает период приема сообщений таймером в миллисекундах;

• Enabled - определяет состояние Включения/Выключения таймера;
Для работы с таймером вам необходимо лишь поместить на форму
компонент Timer, установить его свойство Interval на заданный интервал
времени и обработать событие Elapsed.
КОМПОНЕНТ DateTimePicker
ш
Пн
з

10


17


24


Б :•

4


11


18


25


1?

13


26


Сегодня
IT
Чг

6


13


20


2?

21


wEfi
Пт

7


14


23


нн
Сб

1


а

15


22


02.2003
"п
Ее

2


3


I f i

23


Элемент DataTimePicker представляет собой универсальный
визуальный компонент для представления
информации о времени. Он содержит компонент календарь
(рис. 31.1) и позволяет легко изменять время
в поле компонента.
Компонент DateTimePicker позволяет делать тонкую
настройку формата отображения времени. Это дрстиРис
311 элемент гается за счет возможности задания собственного
управления DateTime- формата отображения.
Picker Основные свойства компонента DateTimePicker следующие:

• Format - позволяет установить один из стандартных форматов отображения
времени либо указать свой;
• ShowUpDown - устанавливает тип элемента с правой стороны поля отображения.
Если установить False - отображается ComboBox, открываю310
Раздел I I I . Программирование для Windows
щий календарь, если True - отображается NumbericUpDown, изменяющий
активное поле отображения;
CustomFormat-строка, описывающая собственный формат отображения
времени;
MaxDate - максимально возможное время для ввода;
MinDate- минимально возможное время для ввода;
Value -значение времени.
СТРУКТУРА DateTime
Не знаю почему, но DateTime объявлена в С# как структура данных, а
не класс, хотя имеет в своем составе и методы, и поля, и свойства. Однако
вас это мало коснется. Как вы знаете, классы и структуры в С# очень
похожи.
Структура DateTime предназначена для хранения и обработки переменных
в формате даты или времени. Структура DateTime настолько
универсальна, что ее используют и при работе со строками, и при работе
с числами, и при работе с базами данных. Структура DateTime
имеет отдельные свойства для каждой категории времени (год, месяц,
число, час, минута, секунда, миллисекунда). Кроме того, DateTime имеет
набор методов для обработки временных интервалов. Например,
можно сложить два временных значения, вычесть, конвертировать в
другой формат...
ФОРМАТ СТРОКИ ВРЕМЕНИ
Очень важной особенностью структуры DateTime является возможность
перевода временного значения в строковый формат. При этом
формат возвращаемой строки может быть задан динамически. Метод
DateTime.ToString возвращает строку времени на основании формата аргумента.
Вот некоторые константы, определяющие формат строки времени:

• dd - два знака дня месяца. Если день состоит из одной цифры - впереди
ставится незначащий 0;
dddd - день недели;
ММ - номер месяца (1-12);
ММММ - название месяца;
УУУУ - номер года;
hh - количество часов (1-12);
НН - количество часов (1-24);
mm - количество минут;
ss - количество секунд.
Кроме того, строка формата может содержать любые разделительные
символы для удобства представления. Вот несколько примеров:
Таймер и время 311
Формат
del MMMM yyyy HH:mm:ss
dd.MM.yyyy HH:mm
Сегодня dd MMMM yyyy года
Значение
21 ноября 2002 14:48:56
21.11.2002 14:48
Сегодня 21 ноября 2002 года
Как видно из таблицы, формат времени может быть очень удобно
подстроен под конкретную задачу. И вам не придется самим склеивать
строки.

Настройка формы
Для закрепления знаний о работе с таймером и временем напишем
программу "Будильник", которая будет давать пользователю возможность
выставить время срабатывания будильника, а по истечении этого времени
на экран будет выводиться сообщение.
Создайте новое Windows Forms приложение с именем TimerApp. Измените
свойство Text формы на "Будильник". Добавьте на форму два компонента
DateTimePicker. Измените их свойства:
dateTimePickerl:
Name - currentPicker;
Format - Time;
dateTimePicker2:
Name - timerPicker;
Format - Time;
ShowChekBox - True.
Один из элементов будет отображать текущее время,
другой - время срабатывания таймера. Элемент
timerPicker будет отображать CheckBox, определяющий,
выставлен ли таймер в активное состояние.
Для улучшения восприятия интерфейса программы
поместите элементы DateTimePicker в GroupBox элементы
(рис. 31.2).
Ьч1И г-1 И
Рис. 31.2. Проектирование
формы приложения
"Будильник"
Обработка таймера
Поместите на форму приложения компонент Timer. Он находится в окне
ТооШох на закладке Components. Мы оставим все свойства таймера по
умолчанию. Далее необходимо создать обработчик единственного события
Elapsed компонента Timer. Щелкните два раза по имени события Elapsed в
окне свойств. При этом в коде программы создастся функция-обработчик с
именем timerl_Elapsed. Измените код обработчика так, как показано ниже:
private void timerl_Elapsed(object sender.
System.Timers.ElapsedEventArgs e)
312 Раздел III. Программирование для Windows
// получаем текущее значение времени
DateTime currentTime = DateTime.Now;
// обновляем значение элемента currentPicker
currentPicker.Value = currentTime;
// если будильник установлен
if (tircerPicker .Checked == true]
i
// сверяем текущее время с временем установленным
// на будильнике с точностью до минуты
if(timerPicker.Value.Minute == currentTime. Minute
timerPicker.Value.Hour == currentTime.Hour &s
timer Picker. Value. Second =-• currentTime. Second)
{
// отключаем будильник
cimerPicker, Checked =- false;
// выводим сообщение
MessageBox.Show("Будильник активизирован");
Таймер программы по умолчанию включен и принимает сообщения с
частотой 10 раз в секунду. Это значит, что каждые 100 миллисекунд будет
вызываться обработчик события Elapsed.
Для постоянного отображения времени в поле компонента currentPicker
необходимо непрерывно изменять его значения, потому как по умолчанию
он инициализируется текущим значением времени и больше не
изменяется. Для изменения значения компонента мы получаем текущее
время:
DateTime currentTime = DateTime.Now;
И затем присваиваем свойству Value компонента currentPicker это значение:

currentPicker. Value = currentTirre;
Эти действия происходят каждые 100 миллисекунд. Если свойство
Checked объекта timerPicker установлено в True, то проверяется совпадение
текущего времени и времени, на которое установлен будильник. Проверяется
только совпадение часов, минут и секунд, большей точности нам
не надо. Если время совпадает, то свойство Checked выставляется в False
и на экран выводится сообщение "Будильник активизирован".
32. ФАЙЛЫ
Пользователь должен иметь возможность сохранить результаты своей
работы на диск и затем прочитать их. Иначе все наработки будут потеряны
при выходе из приложения. Если даже вы не занимались ранее
программированием, то должны знать, что вся информация на диске
хранится в виде файлов. Файлы могут быть записаны в каталоги, а каталоги-
вложены друг в друга. Язык С# предоставляет программистам
возможность легко и просто сохранять и считывать данные с диска.

ПОНЯТИЕ ПОТОКОВ
В основе работы с файлами лежит понятие потоков. Поток ассоциируется
с файлом и предоставляет набор методов для доступа к файлу через
поток. Потоки обладают расширенными функциональными возможностями
по сравнению с файлами. Потоки позволяют записывать и считывать
структуры данных, массивы, другие потоки. Хотя поток и ассоциируется
с файлом, не все данные из потока напрямую попадают в файл. Вся
информация из потока заносится в буфер, и лишь при вызове определенных
команд переносится в файл.
Основными классами для работы с файлами и потоками в С# являются
File, FileStream и StreamReader. Класс File предназначен для создания,
открытия, удаления, изменения атрибутов файла. Класс FileStream предназначен
для чтения и записи информации в файл. Объекты этих классов
работают в паре друг с другом. Механизм их взаимодействия очень
прост и понятен.
Для работы с текстовыми файлами необходимо создать объект типа
FileStream и проинициализировать его открытым файлом. Поскольку все
методы класса File являются статическими (не привязаны к объектам),
нет необходимости создавать экземпляр класса File. Вот типичный пример
инициализации объекта FileStream:
FiieStrean nyStrearr. - File.Open("С:\MyFile.rxt", FileMode.Open,
FileAccess.Read);
В качестве дополнительного инструмента для работы с текстовыми
файлами разработчиками С# были сделаны классы StreamReader и StreamWriter.
Они позволяют читать и писать данные из потока построчно, посимвольно,
сразу все. StreamReader и StreamWriter связываются с потоком
при помощи конструктора инициализации:
Streair.Reader reader - new Strearr.Re.uder (mySuream) ;
StrearaWriier writer = new StreemWriter(mySrream);
314 Раздел I I I . Программирование для Windows
АТРИБУТЫ ОТКРЫТИЯ ФАЙЛОВ
При открытии файла всегда необходимо указывать режим открытия
файла и права доступа к файлу. В данном случае режим открытия установлен
как FileMode.Open, что означает открыть файл, если он существует;
права доступа установлены FileAccess.Re.ad, что означает возможность
только читать файл. Функция Open возвращает объект типа FileStream,
посредством которого в дальнейшем происходят чтение или запись в файл.
ДИАЛОГИ ОТКРЫТИЯ И СОХРАНЕНИЯ ФАЙЛОВ
Вы все хорошо знаете диалоги, предлагающие выбрать путь на диске
и имя файла для открытия или записи (рис. 32.1).
С левой стороны диалога
находятся кнопки
быстрого выбора категории
дискового пространства:
"History", "Desktop",
"My Documents", "My Computer
", "Network". Кроме
того, вы можете выбрать
путь на диске, имя файла,
расширение.
| Для работы с диалога•
ми открытия и сохранения
"-г.п: • ' Jj •."."•• \ файлов используются ком|"."1л
;~~ -| _--;"_ j поненты OpenFileDialog и
' SaveFileDialog, Они во мноРис.
32.1. Диалог открытия файла гом С Х 0 Ж И ' Д л я ОТОбражения
диалога открытия
файла вам необходимо
лишь создать объект класса OpenFileDialog и вызвать его метод ShowDialog.
После закрытия диалога свойство FileName хранит имя выбранного файла
и полный путь к нему.
В этой главе мы создадим простейший текстовый редактор, позволяющий
читать текстовые файлы, редактировать информацию и сохранять
ее в файл.
Создайте новое приложение с именем FileApp. Переименуйте свойство
Text формы в "Текстовый редактор". Поместите на форму компонент
TextBox и измените его свойства:
• Text - "";
• Multiline -True;
• Dock -Fill.
Файлы 315
При этом TextBox должен растянуться на весь экран. Свойство Multiline
позволяет элементу вводить текст в несколько строк, а свойство Dock определяет
положение элемента на форме. Если свойство Dock установлено
в Fill, то элемент займет всю площадь формы.

Поместите на форму компонент MainMenu. Создайте в нем один
пункт "Файл" с двумя подпунктами "Открыть" и "Сохранить". Измените
свойство Name пунктов "Открыть" и "Сохранить" на menuItemOpen
и menuItemSave. Создайте обработчики для пунктов меню "Открыть" и
"Сохранить". Оставьте для них имена по умолчанию, просто щелкнув два
раза указателем мыши по соответствующим пунктам меню. При этом в
код программы должны были добавиться методы menuItemOpenClick и
menuItemSave Click.
Добавьте на форму компоненты OpenFileDialog и SaveFileDialog. Для обоих
установите свойство Filter как "Text files (*.txt)!*.txt". Это означает,
что в диалоге будут показываться только файлы с расширением "txt".
Измените обработчики открытия и сохранения файлов так, как показано
ниже:
private void menuItemOpen_Click(object sender, System.EventArgs e]
i
II показываем диалог выбора файла
openFileDialogi.ShowDialog() ;
// получаем имя файла
string fileName = openFileDialogi.FileName;
// открываем файл для чтения и ассоциируем с ним поток
FileStream stream - File.Open(fileName, FileMode.Open, FileAccess.Read);
// если файл открыт
if(stream != null)
{
// создаем объект StreamReader и ассоциируем
// его с открытым потоком
StreamReador reader = new StreamReader(stream);
// читаем весь файл и записываем в ТехсВох
textBoxl .Text = reader. ReadToEnd О;
// закрываем файл
stream.Close();
private void menuItemSave_Click: (object sender. System.EventArgs e)
(
// показываем диалог выбора файла
saveFileDialogl.ShowDialog();
316 Раздел I I I . Программирование для Windows
// получаем имя файла
string fileName -^ saveFileDiaiogl . FileName;
// открываем файл для записи и ассоциируем с ним поток
FileStream. stream = File.Open(fileName, FiieMode.Create, FileAccess.Write]
// если файл открыт
if(stream != null)
{
// создаем объект StreamWriter и ассоциируем
// его с открытым потоком
StreamWriter writer =• new StreamWriter(stream);
// записываем данные в поток
writer.Write(cextBoxl.Text);
// переносим данные из потока в файл
writer.Flush();
// закрываем файл
stream.Close();
Подробное описание работы методов дано в комментариях. Работа с
чтением файла идет в 6 этапов:
• открытие файла;
• ассоциация файла с потоком;
• ассоциация потока со StreamReader;
• чтение данных;
• перенос данных в TextBox;
• закрытие файла.
Запись файла также проходит в 6 этапов:
• открытие файла;
• ассоциация файла с потоком;
• ассоциация потока со StreamWriter;
• запись данных;
• освобождение потока;
• закрытие файла.
Запустите приложение. Выберите пункт Открыть. В открывшемся
диалоге (рис. 32.1) выберите текстовый файл. После нажатия кнопки ОК
данные из файла отобразятся в окне программы. Измените текст файла.
Нажмите меню Сохранить. В открывшемся окне выберите новое имя
файла, чтобы не затереть старый файл. После нажатия кнопки ОК данные
из программы перенесутся в файл. Вы можете убедиться в этом,
воспользовавшись программой "Блокнот".
33. РАБОТА С БАЗАМИ ДАННЫХ
РЕЛЯЦИОННАЯ МОДЕЛЬ БАЗ ДАННЫХ
Для начала вам следует понять основополагающие моменты при проектировании
реляционных баз данных. На сегодняшний день уже существует
ряд СУБД, которые выполняют за вас большую часть работы при проектировании
баз данных, например Microsoft Access, SQL server, Oracle, DB2,
InterBase и т. д. Все они позволяют организовать доступ к своим ресурсам
через язык SQL. SQL символизирует собой Структурированный Язык Запросов.

Это язык, который дает возможность создавать и работать в реляционных
базах данных, являющихся наборами связанной информации, сохраняемой
в таблицах.
Что такое реляционная база данных?
Реляционная база данных - это тело связанной информации, сохраняемой
в двумерных таблицах. Напоминает адресную или телефонную книгу.
В книге имеется большое количество входов, каждый из которых соответствует
определенной особенности. Для каждой такой особенности может
быть несколько независимых фрагментов данных, например имя, телефонный
номер и адрес.
Предположим, что вы должны сформатировать адресную книгу в виде
таблицы со строками и столбцами. Каждая строка (называемая также
записью) будет соответствовать определенной особенности; каждый столбец
будет содержать значение для каждого типа данных - имени, телефонного
номера и адреса, представляемого в каждой строке. Адресная
книга могла бы выглядеть следующим образом:
То, что вы получили,
является основой реляционной
базы данных,
двумерной (строка и
столбец) таблицей информации.
Однако реляционные
базы данных
редко состоят из
одной таблицы. Такая таблица меньше, чем файловая система. Создав
несколько таблиц взаимосвязанной информации, вы сможете выполнить
более сложные и мощные операции с данными. Мощность базы данных
зависит от связи, которую вы можете создать между фрагментами информации,
а не от самого фрагмента информации.
Имя
Иван
Петр
Олег
Иванов
Петпов
Волков
Телефон
234-23-12
234-56-76
23241-43
Адрес
ул.
ул.
ул.
Московская, 12/237
Советская. 42/34
Пушкинская, 2/17
318 Раздел I I I . Программирование для Windows
Рассмотрим связь между данными на основе базы данных "Students",
которую мы создадим. Это будет довольно простой пример связывания
данных, хранящихся в разных таблицах. Определим для начала, какие
поля нам необходимы для хранения информации о студенте. Требуемая
информация представлена в таблице:
Фамилия Имя Возраст студента Название университета Год образования
университета
Однако студентов, данные о которых будут храниться в базе данных,
намного больше количества имеющихся университетов. И в результате
может получиться, что из 10 000 зарегистрированных в базе студентов
5000 учатся в одном университете. А это значит, что в графе "Название
университета" существует 5000 однотипных записей. То же самое и в графе
"Год образования университета".
Если же мы хотим сэкономить на объеме базы данных, то нужно
вынести поля, касающиеся университета, в отдельную таблицу. В результате
мы получим две таблицы: одну с данными о фамилии, имени и
возрасте студента ("Студенты"), вторую - об университете, в котором он
учится ("Университеты").
Теперь поля таблицы "Университеты" будут содержать намного меньше
записей, чем когда они находились в исходной таблице. Возникает
вопрос, как теперь мы узнаем, в каком именно из университетов учится
тот или иной студент. Для этого в каждую из таблиц "Студенты" и
"Университеты" нам необходимо добавить еще по одному полю, которые
и будут определять связь между студентами и их учебными заведениями.

Фамилия Имя Возраст ГО университета
Название университета Год образования университета Ш университета
Теперь, внося в базу информацию о студенте, не надо указывать полное
название его учебного заведения, достаточно лишь знать ID нужного
университета.

Например, в базе данных собрана информация о студентах, которые
учатся в:
• Московском государственном технологическом университете;
• Московском государственном институте международных отношений;
• Московском государственном университете физкультуры и спорта.
Работа с базами данных 319
Каждый из этих университетов имеет свой уникальный номер (ID).
Соответственно:
• 1002;
• 1003;
• 1004.
Если студент учится в Московском государственном технологическом
университете, то при внесении его в базу в поле "ID университета" мы
запишем 1002.
Можно посчитать, сколько места на диске мы сэкономили, применив
реляционную концепцию баз данных. Название "Московский государственный
технологический университет" имеет размер 53 байта. Плюс поле
"Год образования университета" имеет формат date/time и занимает
8 байт. 53 + 8 = 61. А число 1003 занимает всего 2 байта.
61 - 2 = 59. При наличии в базе 1000 студентов этого университета мы
высвобождаем 59 х 1000 байт - 59 000 байт. С первого взгляда это небольшой
объем. Но при осуществлении серьезных проектов эта цифра возрастает
в сотни раз, что заметно сказывается на скорости обработки информации.
Хотя если встает вопрос между выбором скорости и объема, следует
отдавать предпочтение скорости, так как время доступа к данным
на сегодняшний день намного дороже, чем цена жесткого диска.
Таблицы записи и поля
Теперь давайте рассмотрим реляционную модель данных на конкретном
примере. Для этого возьмем базу данных Northwind, поставляемую
вместе с SQL server 7.0 или SQL server 2000. Northwind -это база данных,
описывающая вымышленную компанию, покупающую и продающую продовольственные
товары. Данные для Northwind разделены на 13 таблиц,
таких как Customers, Employees, Orders, Order Details, Products и т. д.
Каждая таблица в реляционной базе данных организована в строки,
где каждая строка представляет собой отдельную запись. Строки организованы
в столбцы. Все строки в таблице имеют одинаковую структуру
столбцов (полей). Например, таблица заказов Orders имеет следующие
поля: OrderlD, CustomerlD, EmployeelD, OrderDate и т. д. Для любого
заказа вы должны знать имя заказчика, его адрес, контактное имя и т. д.
Вы можете сохранять информацию для каждой записи, но это будет неэффективно.
Вместо этого создатели базы придумали вторую таблицу с
именем Customers, в которой каждая строка представляет собой единственного
заказчика. Каждый заказчик имеет уникальный идентификатор
(поле CustomerlD, которое отмечено как первичный ключ для этой
таблицы). Первичный ключ - это столбец или комбинация столбцов,
которые уникально идентифицируют запись в таблице.
Таблица Orders использует поле CustomerlD как вторичный ключ (foreign
key). Вторичный ключ - это поле или комбинация полей, которые являются
первичным ключом для другой таблицы. Таблица Orders использует
CustomerlD (первичный ключ, используемый в таблице Customers), что

Список страниц

Закладка в соц.сетях

Купить

☏ Заказ рекламы: +380504468872

© Ассоциация электронных библиотек Украины

☝ Все материалы сайта (включая статьи, изображения, рекламные объявления и пр.) предназначены только для предварительного ознакомления. Все права на публикации, представленные на сайте принадлежат их законным владельцам. Просим Вас не сохранять копии информации.