ВУЗ: Не указан

Категория: Методичка

Дисциплина: Базы данных

Добавлен: 09.02.2019

Просмотров: 1256

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

SELECT * FROM Person

Здесь символ "*" означает выбор всех полей таблицы. В этом случае индексы полей таблицы Person имеют следующие значения, которые представлены в таблице 1.2.

Таблица 1.2.Индексы полей таблицы Person


Имя поля

Индекс

ID

0

Name

1

DepID

2

Post

3

Oklad

4

Как видно из нумерации полей таблицы Person, выражение curRow.Cells[4] дает ссылку на поле Oklad.

13) Доступ к записям таблицы с помощью класса DataTable

Объект класса DataTable предназначен для сохранения локальной копии таблицы. Этот класс имеет свойство Rows, который представляет собой коллекцию записей таблицы. Это свойство удобно использовать в том случае, когда необходимо перемещаться по всем записям таблицы.


Рис. 1.17. Вычисление среднего оклада служащих

Как видно, здесь оставлено только одно текстовое поле для вывода среднего оклада служащих. Код вычисления среднего оклада можно реализовать в обработчике события Form_Load. Для этого в конец этого обработчика добавляйте следующий код:

double Sum = 0, Sr;

foreach (DataRow person in Person.Rows)

{

Sum = Sum + Convert.ToDouble(person["Oklad"]);

}


Sr = Sum / Person.Rows.Count;

textBox1.Text = Convert.ToString(Sr);

Как видно, внутри тела оператора foreach вычисляется сумма окладов. Текущая запись набора данных присваивается объекту класса DataRow. К полю текущей записи можно обращаться, по названию поля:

person["Oklad"]

14) Команды языка SQL для редактирования, добавления и удаления записей. Общий формат команд UPDATE, INSERT и DELETE.

UPDATE – изменение существующей записи;

UPDATE имя_таблицы

SET столбец1 = значение1, столбец2 = значение2, ... столбецN = значениеN

[FROM выборка AS псевдоним_выборки]

UPDATE Person SET Oklad = Oklad + 2000

WHERE Oklad < 15000

[WHERE условие_обновления]

INSERT – вставка новой записи;

INSERT [INTO] имя_таблицы [(список_столбцов)] VALUES (значение1, значение2, ... значениеN)

SqlCommand command = new SqlCommand("INSERT INTO [PriceList] (Product, Brends_Id, Id_Product, Price, Quantity)VALUES(@Product, @Brends_Id, @Id_Product, @Price, @Quantity)", formForAdmin.conn);

command.Parameters.AddWithValue("Product", textBox1.Text);

command.Parameters.AddWithValue("Brends_Id", textBox2.Text);

command.Parameters.AddWithValue("Id_Product", textBox3.Text);

command.Parameters.AddWithValue("Price", textBox4.Text);

command.Parameters.AddWithValue("Quantity", textBox5.Text);

command.ExecuteNonQuery();

// Вывод данных обновленной таблицы

formForAdmin.PriceLists.Clear();

formForAdmin.adapPriceLists.Fill(formForAdmin.PriceLists);

DELETE – удаление записи.

DELETE [FROM] имя_таблицы WHERE условие_удаления

//удаление данных по вводу их айди

SqlCommand command = new SqlCommand("DELETE FROM [PriceList] WHERE [Id]=@Id", conn);

command.Parameters.AddWithValue("Id", textBox1.Text);

command.ExecuteNonQuery();

PriceLists.Clear();

adapPriceLists.Fill(PriceLists);


15) Использование команды UPDATE для изменения должности и оклада служащего.

Для изменения значения полей группы записи на языке SQL имеется команда UPDATE. Синтаксис использования этой команды ниже рассматривается в различных примерах. Например, для изменения оклада группы служащих, у которых оклад менее 15000 рублей можно выполнить следующую команду:



UPDATE Person SET Oklad = Oklad + 2000

WHERE Oklad < 15000


Пример использования этой команды при создании приложения базы данных.

Напишите обработчик события Click для кнопки Изменить данные служащего. При нажатии на эту кнопку должна измениться значения полей Post и Oklad таблицы Person.

private void button1_Click(...)

{

string Post = "'" + comboBox1.Text + "', ";

string Oklad = textBox3.Text;

string curID = textBox1.Text;


string updateStr = "UPDATE Person SET " +

" Post = " + Post +

" Oklad = " + Oklad +

" WHERE ID = " + curID;


SqlCommand updateCmd = new SqlCommand(updateStr, conn);

updateCmd.ExecuteNonQuery();


// Вывод данных обновленной таблицы

Person.Clear();

adapPerson.Fill(Person);

}

16) Использование параметрического SQL-запроса для изменения должности и оклада служащего.

При решении практических задач одни и те же SQL-запросы отличаются друг от друга только некоторыми параметрами. Например, в предыдущем примере, при удалении записи по номеру ID, удаляемая запись отличается от другой удаленной записи только по номеру ID. Поэтому появляется необходимость создания параметрических SQL-запросов. Параметр SQL-запроса выделяется префиксом “@”. Например,

DELETE FROM Person WHERE ID = @ID

В этом SQL-запросе @ID означает параметр SQL-запроса. Заметим, что формирование SQL-запроса в виде символьной строки является опасным способом работы с данными с точки зрения хакерских атак, так как эта строка содержит некоторую информацию о данных таблицы. Поэтому запросы следует формировать в виде параметрических SQL-запросов, которые компилируются в стадии создания исполнимого файла.

Пример использования при создании приложения базы данных.

При нажатии на эту кнопку должны измениться значения полей Post и Oklad таблицы Person. Параметр SQL-запроса выделяется префиксом “@”.

private void button1_Click(...)

{

string ID = textBox1.Text;

string Oklad = textBox3.Text;

string Post = comboBox1.Text;


string updateStr = "UPDATE Person SET " +

"Post = @Post, " +

"Oklad = @Oklad " +

"WHERE ID = @ID ";

SqlCommand updateCmd = new SqlCommand(updateStr, conn);

//Добавление параметров в коллекцию Parameters

updateCmd.Parameters.Add("@Post",SqlDbType.NChar, 10);

updateCmd.Parameters.Add("@Oklad", SqlDbType.Money);

updateCmd.Parameters.Add("@ID",SqlDbType.Int);

// Определение значений параметров

updateCmd.Parameters["@Post"].Value = Post;

updateCmd.Parameters["@Oklad"].Value = Oklad;

updateCmd.Parameters["@ID"].Value = ID;

updateCmd.ExecuteNonQuery();

// Вывод данных обновленной таблицы

Person.Clear();

adapPerson.Fill(Person);

}

17) Использование команды INSERT для добавления новой записи в таблицу Person.

Для добавления нового служащего можно выполнить следующую команду:

INSERT INTO Person (Name, Oklad, Post)

VALUES("Иванов", 40000, "Директор");


Пример. Для добавления новой записи в удаленную базу данных определите следующий обработчик события для кнопки Добавить нового служащего:


private void button2_Click(...)

{

string ID = textBox1.Text + ", ";

string Name = "'" + textBox2.Text + "', ";

string Post = "'" + comboBox1.Text + "', ";

string Oklad = textBox3.Text;


string insertStr = "INSERT INTO Person "+

"(ID, Name, Post, Oklad) " +

"VALUES (" + ID + Name + Post + Oklad + ")";


SqlCommand insertCmd = new SqlCommand(insertStr, conn);


insertCmd.ExecuteNonQuery();


// Вывод данных обновленной таблицы

Person.Clear();

adapPerson.Fill(Person);

}

Как видно, вначале формируется строка SQL-запроса. В SQL-запросе значения полей ID, Name, Post и Oklad разделены запятыми, эти запятые определяются в одноименных переменных строкового типа. Значения строковых полей (Name и Post) должны быть взяты в одинарные кавычки. Эти одинарные кавычки также определены в строковых переменных.

18) Использование параметрического SQL-запроса для добавления новой записи в таблицу Person

private void button2_Click(...)

{

string ID = textBox1.Text;

string Name = textBox2.Text;

string Oklad = textBox3.Text;

string Post = comboBox1.Text;


string insertStr = "INSERT INTO Person (ID, Name, Post, Oklad)" +

" VALUES (@ID, @Name, @Post, @Oklad)";


SqlCommand insertCmd = new SqlCommand(insertStr, conn);

//Добавление параметров в коллекцию Parameters

insertCmd.Parameters.Add("@ID", SqlDbType.Int);

insertCmd.Parameters.Add("@Name", SqlDbType.NChar, 10);

insertCmd.Parameters.Add("@Post", SqlDbType.NChar, 10);

insertCmd.Parameters.Add("@Oklad", SqlDbType.Float);


// Определение значений параметров

insertCmd.Parameters["@ID"].Value = ID;

insertCmd.Parameters["@Name"].Value = Name;

insertCmd.Parameters["@Post"].Value = Post;

insertCmd.Parameters["@Oklad"].Value = Oklad;

insertCmd.ExecuteNonQuery();


// Вывод данных обновленной таблицы

Person.Clear();

adapPerson.Fill(Person);


Комментарии кода этих процедур.

1. Как видно из кода, каждый параметр должен быть добавлен в коллекцию параметров Parameters. Для этого используется метод Add. При вызове этого метода указываются имя и тип параметра, и если параметр строкового типа, то указывается еще ширина поля.

2. Далее, с помощью свойства Value присваивается значение параметра. При многократном использовании параметрического SQL-запроса, следует определить только значения параметров, что значительно упрощает формирование SQL-запроса.

19) Использование новой формы для заполнения данных новой записи

Для пункта 19 и 20

===================================================

Шаг 1. Вначале командой Project/Add Windows Form добавляйте в проект новую форму Form2. На этой форме разместите текстовых полей для ввода или редактирования значений полей ID, Name и Oklad (Рис. 1.22). Для выбора должности служащего на форме разместите раскрывающиеся список comboBox1 и заполните свойство Items со списком должностей. Для сохранения введенных данных в таблице Person удаленной базы данных разместите кнопку Сохранить.

Рис. 1.22. Вспомогательная форма приложения

В коде Form2 приходится обращаться к объектам, размещенным на форме Form1. Для обращения к этим объектам вначале следует получить ссылку на форму Form1. Для сохранения этой ссылки в коде класса Form2 объявляйте глобальную переменную:


public partial class Form2 : Form

{

public Form1 form1;

. . . . . . . . . .

В коде формы Form1 приходится использовать текстовых полей и раскрывающиеся список comboBox1, размещенных на форме Form2. Поэтому этих объектов следует объявлять с модификатором доступа public. Объявления этих объектов находятся в файле Form2.Designer.cs. С помощью окна Solution Explorer откройте этот файл и измените модификаторов доступа.


public System.Windows.Forms.TextBox textBox1;

public System.Windows.Forms.TextBox textBox2;

public System.Windows.Forms.TextBox textBox3;

public System.Windows.Forms.ComboBox comboBox1;


Шаг 2. Теперь из формы Form1 удалите текстовых полей и раскрывающиеся список comboBox1. Таким образом, на форме остается только две кнопки Добавить служащего и Редактировать (Рис. 1.23).

Рис. 1.23. Главная форма приложения

Для того, чтобы переменные Form1 были доступны в коде формы Form2, переменных Form1 следует объявлять с модификатором доступа public:

public partial class Form1 : Form

{

public SqlConnection conn;

public SqlDataAdapter adapPerson;

public DataTable Person;

. . . . . . . . . . . . . . . . .

====================================================================


Вспомогательная форма Form2 предназначена для добавления нового служащего. Для хранения режима перехода на эту форму в классе Form1 объявляйте глобальную переменную:

public int Option;

При нажатии на одну из кнопок главной формы Form1 вы должны создавать объект класса Form2 и передавать ссылку на главную форму. С учетом сказанного, обработчик события кнопки Добавить служащего имеет следующий вид:

private void button1_Click(. . .)

{

// Код кнопки Добавить служащего

Option = 1;

Form2 form2 = new Form2();

form2.form1 = this;


form2.Show();

}


20) Использование новой формы для редактирования записи.(см. п. 19)

Вспомогательная форма Form2 предназначена для редактирования существующей записи. Для хранения режима перехода на эту форму в классе Form1 объявляйте глобальную переменную:

public int Option;

При нажатии на кнопку Редактировать значения полей ID, Name, Post и Oklad текущей записи должны отображаться на соответствующих полях формы Form2. Ниже приведен код обработчика события этой кнопки:

private void button2_Click(...)

{

// Код кнопки Редактировать

Option = 2;


Form2 form2 = new Form2();

form2.form1 = this;


DataGridViewRow curRow = dataGridView1.CurrentRow;

form2.textBox1.Text = curRow.Cells["ID"].Value.ToString();

form2.textBox2.Text = curRow.Cells["Name"].Value.ToString();

form2.textBox3.Text = curRow.Cells["Oklad"].Value.ToString();

form2.comboBox1.Text =curRow.Cells["Post"].Value.ToString();

form2.Show();

}

21) Проектирование структуры базы данных. Правила первой, второй и третьей нормальной формы. Типы отношений между записями связанных таблиц.

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

Первая нормальная форма

Первая и главная нормальная форма требует от таблицы (а точнее, от ее проектировщика) следования следующим правилам:

1. Каждый столбец в строке должен быть атомарным. Примером, который не удовлетворяет этому требованию, является поле Name таблицы Person, если в это поле вводить фамилию, имя и отчество служащего. Чтобы эти данные были атомарными для фамилии, имени и отчеству следует определить отдельные поля.


2. Каждая строка в таблице обязана содержать одинаковое количество столбцов. Если данные определены в виде таблицы, то это условие выполняется автоматически, так как таблица всегда имеет одинаковое число столбцов для всех записей таблицы.

3. Все строки в таблице должны быть уникальны. Например, может быть два служащих однофамильцев Ивановых, которые имеют одинаковые должности, даты рождения, номера телефона и т.д. Для ввода различия следует ввести идентификатор служащего (поле ID).

Таким образом, условия первой нормальной формы выполняются очень легко. Заметим, что каждая последующая нормальная форма предполагает выполнение правил предыдущей нормальной формы, поэтому при изучении последующих нормальных форм, предположим, что это условие выполняется.

Вторая нормальная форма

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

  1. Для повторяющихся значений поля в различных записях следует создать отдельную таблицу

  2. Связать эти таблицы с помощью внешнего ключа.

Третья нормальная форма.

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

Типы отношений между записями связанных таблиц.

связь один к одному;

При установлении связи "один к одному" каждой строке таблицы А может соответствовать только одна строка таблицы Б и наоборот. Связь "один к одному" создается в том случае, когда оба связанные столбца являются первичными ключами или на них наложены ограничения уникальности.

связь один ко многим;

Является наиболее часто используемым типом связи. В такой связи каждой записи в таблице А (первичный ключ) соответствует несколько записей в таблице В (внешний ключ), а запись в таблице В не может иметь более одной соответствующей ей записи в таблице А. Таблица А называется главной ,а таблица В подчиненной таблицей. Или иногда таблицу А называют родительской таблицей, а В – дочерней .

связь многие ко многим.

При установлении связи "многие ко многим" каждой строке таблицы А может соответствовать множество строк таблицы Б и наоборот. Такая связь создается при помощи третьей таблицы, называемой соединительной, первичный ключ которой состоит из внешних ключей, связанных с таблицами А и Б.

Создаём таблицу Devices(процессор, материнская плата, ОЗУ, дисплей и т.д.), Firms(название фирмы, адрес, телефон, название руководителя, адрес сайта и т.п.), Tovari(имя устройства, код типа устройства и фирмы-производителя, характеристику устройства (поле Character1), цену устройства и количества устройств, которые имеются в складе). Эти таблицы взаимосвязаны с помощью полей DevID и FirmID. Для определения этих связей в окне Server Explorer выберите узел Database Diagrams и выполните команду Add New Diagram. При этом появляется окно со списком таблиц базы данных.