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

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

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

Добавлен: 09.02.2019

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

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

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

Для добавления таблицу в диаграмму следует выбрать имя таблицы и нажать на кнопку Add. Таким образом, выберите все три таблицы. Тогда на рабочей области появятся три прямоугольные области, которые содержат структуру таблиц Devices, Firms и Tovari. Заметьте, что таблицы Devices и Firms связаны с таблицей Tovari. Кроме этого, таблицы Devices и Firms взаимосвязаны друг с другом

22) Вывод записей по категориям с помощью ComboBox.

Для вывода товаров по категориям, на практике обычно применяют раскрывающиеся список ComboBox. Ниже показано использование этого элемента для вывода товаров по категориям. Создайте новое приложение и разместите на форме элементов управления DataGridView и ComboBox (Рис. 1.28).

Рис. 1.28. Вывод записей по типу устройства

В коде этого приложения будет использоваться объекты классов SqlCommand, SqlDataAdapter и DataTable для всех трех таблиц базы данных Computer. Эти объекты будут использоваться в разных обработчиках событий. Поэтому их следует объявлять как глобальных переменных класса Form1:

public partial class Form1 : Form

{

string conStr;

SqlConnection conn;


string strTovari, strDevices, strFirms;

SqlCommand cmdTovars, cmdDevices, cmdFirms;


SqlDataAdapter adapTovars, adapDevices, adapFirms;


DataTable Devices, Firms,Tovars;

BindingSource TovariBS;


int index1, index2;

string DevID, FirmID;


DataRow[] curRow;

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

Раскрывающиеся список comboBox1 должен заполняться со значениями поля DevName таблицы Devices. При запуске приложения в этом списке должна быть выбрана строка “Все типы устройств”, а в элементе управления dataGridView1 должны отображаться все записи таблицы Tovars. Все эти работы следует выполнить в обработчике события Form1_Load:

private void Form1_Load(...)

{

// Соединение с базой данных Computer

conStr = "Data Source=(local)\\SQLEXPRESS;" +

"Initial Catalog = Computer;" +

"Integrated Security = True";

conn = new SqlConnection(conStr);

conn.Open();


// Вывод всех записей таблицы Tovars

strTovars = "SELECT * FROM Tovars";

cmdTovars = new SqlCommand(strTovars, conn);


// Скачивание данных в локальную таблицу

adapTovars = new SqlDataAdapter(cmdTovars);

Tovars = new DataTable();

adapTovars.Fill(Tovars);


// Привязка источника данных на dataGridView1

bsTovars = new BindingSource();

bsTovars.DataSource = Tovars;

dataGridView1.DataSource = bsTovars;


// ТАБЛИЦА Devices

strDevices = "SELECT * FROM Devices";

cmdDevices = new SqlCommand(strDevices, conn);

adapDevices = new SqlDataAdapter(cmdDevices);


Devices = new DataTable();

adapDevices.Fill(Devices);


// Заполнение ComboBox

comboBox1.Items.Add("Все типы устройств");

foreach (DataRow dev in Devices.Rows)

{

comboBox1.Items.Add(dev["DevName"]);

}

comboBox1.SelectedIndex = 0;

}

При выборе из списка comboBox1 типа устройства, в элементе управления dataGridView1 должны выводиться только те товары, которые относятся к выбранному типу устройства. Для реализации этой функциональности напишите обработчик события SelectedIndexChanged для comboBox1.

private void comboBox1_SelectedIndexChanged(...)

{

strTovars = "SELECT * FROM Tovars ";

index1 = comboBox1.SelectedIndex;


// Если выбран конкретный тип устройства

if (index1 > 0)

{

curRow = Devices.Select("DevName = '" + comboBox1.Text + "'");

DevID = curRow[0]["DevID"].ToString();


strTovars = strTovars + " WHERE DevID = " + DevID;

}


cmdTovars.CommandText = strTovars;

Tovars.Clear();

adapTovars.Fill(Tovars);

}

В раскрывающемся списке comboBox1 пользователь выбирает название типа устройства - DevName. Для поиска записи в таблице Devices по типу устройства применяется метод Select класса DataTable. Этот метод возвращает набор записей, удовлетворяющих условию поиска.



23) Перемещение записей из одной таблицы в другую (например, в Корзину).

В компьютерном салоне клиент выбирает компонентов компьютера, и тем самым определяет конфигурацию своего компьютера. Обычно выбранные товары следует переместить в таблицу-корзину.

Для организации этой работы добавьте в базу данных новую таблицу Korzina. Эта таблица должна содержать основных характеристик товаров, поэтому для него определите следующих полей: TovarID, TovarName, Price и Kol. Чтобы отображать данных таблицы Korzina на форме, разместите элемент управления dataGridView2. Также разместите два текстовых поля для ввода количества товаров и для отображения стоимости набранных товаров (Рис. 1.30).

Рис. 1.30. Добавление товаров в Корзину

Для работы с таблицей Korzina объявите глобальных переменных.

public partial class Form1 : Form

{

string strKorzina;

SqlCommand cmdKorzina;


SqlDataAdapter adapKorzina;

DataTable Korzina;

BindingSource bsKorzina;

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


В обработчике события Form_Load добавьте код для вывода таблицы Korzina в элементе управления dataGridView2.

private void Form1_Load(...)

{

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

strKorzina = "SELECT * FROM Korzina ";

cmdKorzina = new SqlCommand(strKorzina, conn);


// Копирование данных в локальную таблицу

adapKorzina = new SqlDataAdapter(cmdKorzina);

Korzina = new DataTable();

adapKorzina.Fill(Korzina);

// Привязка данных на DataGridView

bsKorzina = new BindingSource();

bsKorzina.DataSource = Korzina;

dataGridView2.DataSource = bsKorzina;

}

Для реализации перемещения товара из таблицы Tovars в таблицу Korzina на форме разместите кнопку Выбор.

В обработчике события кнопки Выбор вы должны формировать и выполнить SQL-команду INSERT для таблицы Korzina. Ниже приведен код этого обработчика события.

private void button1_Click(...)

{

DataGridViewRow curRow = dataGridView1.CurrentRow;

string TovarID = curRow.Cells["TovarID"].Value.ToString() + ", ";

string TovarName =

"'" +curRow.Cells["TovarName"].Value.ToString() + "', ";

string Price = curRow.Cells["Price"].Value.ToString() + ", ";

string Kol = textBox1.Text;


string insertStr = "INSERT INTO Korzina " +

"(TovarID, TovarName, Price, Kol) " +

"VALUES (" + TovarID + TovarName + Price + Kol + ")";


SqlCommand insertCmd = new SqlCommand(insertStr, conn);

insertCmd.ExecuteNonQuery();


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

Korzina.Clear();

adapKorzina.Fill(Korzina);


textBox2.Text = SumTovars().ToString();

}

24) Использование транзакций. Команды для формирования тела транзакции, для подтверждения и отказа от транзакции

Для реализации группового выполнения SQL-запросов предназначены транзакции. SQL-запросы можно сгруппировать в транзакцию, а затем зафиксировать результат или откатить эту транзакцию как одно целое. Например, команд INSERT и UPDATE в примере компьютерного салона можно поместить в транзакцию, а затем подтвердить или откатить эту транзакцию как одно целое, в зависимости от того, выполнились ли успешно оба SQL-запроса.

Для начала транзакции используется оператор BEGIN TRANSACTION (сокращенно BEGIN TRANS), а далее следуют составляющие транзакцию SQL-команды. Чтобы зафиксировать транзакцию, исполняется запрос COMMIT TRANSACTION (сокращенно COMMIT), а для отката транзакции выполняется запрос ROLBACK TRANSACTION (сокращенно ROLLBACK).


измените код кнопки выбора товаров в Корзину.

private void button1_Click(...)

{

DataGridViewRow curRow = dataGridView1.CurrentRow;

string TovarID = curRow.Cells["TovarID"].Value.ToString();

string TovarName = "'" + (string)curRow.Cells["TovarName"].Value

+ "', ";

string Price = curRow.Cells["Price"].Value.ToString() + ", ";

string Kol = textBox1.Text;


string insertStr = "INSERT INTO Korzina " +

"(TovarID, TovarName, Price, Kol) " +

"VALUES (" + TovarID + ", " + TovarName + Price + Kol + ")";

SqlCommand insertCmd = new SqlCommand(insertStr, conn);


// Объекты для обновления таблицы Tovari

int curKol = (int)curRow.Cells["Kol"].Value;

curKol = curKol - Convert.ToInt32(Kol);


string updateStr = "UPDATE Tovars SET Kol = " + curKol +

" WHERE TovarID =" + TovarID;

SqlCommand updateCmd = new SqlCommand(updateStr, conn);

// Создание объектов для транзакции

SqlCommand transCmd = new SqlCommand("BEGIN TRANSACTION", conn);

transCmd.ExecuteNonQuery();


insertCmd.ExecuteNonQuery();

updateCmd.ExecuteNonQuery();


transCmd.CommandText = "COMMIT";

transCmd.ExecuteNonQuery();

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

}

25) Использование хранимых процедур и триггеров для отбора скалярных и векторных данных.

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

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

Хранимые процедуры и триггеры создаются на языке, зависящем от производителя СУБД. Например, в случае MS SQL Server хранимые процедуры создаются на языке, известном под названием Transact-SQL.

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

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

CREATE PROCEDURE GetTovar

@TovarID int = 5,

@TovarName char(10) OUTPUT

AS

SELECT @ TovarName = TovarName FROM Tovars

WHERE TovarID = @ TovarID

Заметьте, что в этом примере хранимая процедура в качестве параметра получает один скалярный параметр @TovarID, и возвращает другой скалярный параметр @TovarName.

Сохраните эту процедуру командой Файл/ Сохранить.... При сохранении этой процедуре автоматически будет присвоено имя GetTovar, взятое из оператора CREATE PROCEDURE. После этого новая хранимая процедура будет видна в окне Обозреватель серверов.


SqlCommand cmd = new SqlCommand("GetTovar", conn);

cmd.CommandType = CommandType.StoredProcedure;

//Входной параметр

SqlParameter param = new SqlParameter();

param.ParameterName = "@TovarID";

param.SqlDbType = SqlDbType.Int;

param.Value =Convert.ToInt32(textBox1.Text);

param.Direction = ParameterDirection.Input;

cmd.Parameters.Add(param);



//Выходной параметр

param = new SqlParameter();

param.ParameterName = "@TovarName";

param.SqlDbType = SqlDbType.Char;

param.Size = 10;

param.Direction = ParameterDirection.Output;

cmd.Parameters.Add(param);


// Вызов хранимой процедуры

cmd.ExecuteNonQuery();

textBox2.Text = (string)cmd.Parameters["@TovarName"].Value;

Теперь запустите приложение, введите в текстовое поле textBox1 значение ID товара и нажмите на кнопку. Тогда в текстовом поле textBox2 появляется фамилия служащего

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

CREATE PROCEDURE "GetTovars" AS

SELECT TovarName, Price FROM Tovars

GO


private void button1_Click(...)

{

SqlCommand cmd = new SqlCommand("GetTovars", conn);

cmd.CommandType = CommandType.StoredProcedure;

cmd.ExecuteNonQuery();


adapTovars.SelectCommand = cmd;

DataTable Tovars2 = new DataTable();

adapTovars.Fill(Tovars2);

dataGridView2.DataSource = Tovars2;

}