Слайд 1Лекция №7 БАЗЫ ДАННЫХ
Москва, 2019
Слайд 2Разработка базы данных в MSAccess
Типы данных Microsoft Access
Применение определенного типа
данных позволяет избежать ошибок в работе с таблицами - в
поле с форматом даты невозможно ввести значение суммы, а в поле с денежным форматом невозможно ввести дату.
Слайд 3Разработка базы данных в MSAccess
управления туристической фирмой.
Слайд 4Разработка базы данных в MSAccess
Слайд 5Разработка базы данных в MSAccess
Слайд 6Разработка базы данных в MSAccess
Отношение "один-ко-многим" далее появится у нас
между таблицами "Информация о туристах" и "Путевки" - один турист
может приобрести несколько путевок
Слайд 11Подключение к внешней базе MSSQL
Слайд 12ADO NET
ADO NET
Требуюшие подключение: Connection,
Transaction, DataAdapter, Command, Parameter, DataReader
Не требуюшие
подключение: DataSet, DataTable, DataRow, DataColumn, Constraint, DataView
Слайд 14Проверка подключения
Поставщики данных:
OLE DB и SQL Client
Объект connection класса OleDbConnection:
OleDbConnection
connection = new OleDbConnection();
State — свойство, определяющее состояние подключения.
Теперь посмотрим
на методы, которые есть у класса:
BeginDbTransaction() — запустить транзакцию базы данных (метод унаследо-
ван от класса DbConnection);
BeginTransaction() — перегруженный метод начала транзакции базы данных;
ChangeDatabase() — установить новую базу данных на сервере, к которому мы
сейчас подключены;
Close() — закрыть соединение
CreateCommand() — создать объект OleDBCommand
Хорошим тоном является явное закрытие соединения с базой данных
Слайд 15Проверка подключения
В реальном приложении соединение с базой данных чаще всего
делают в кон-
структоре класса, и если соединение не прошло успешно,
то программу просто за-
крывают. Нет смысла запускать программу, работающую с базой данных, без воз-
можности создать реальное соединение с сервером.
Пул соединений
Открытие и закрытие соединений с базой данных — очень дорогое удовольст-
вие с точки зрения производительности. В момент инициализации подключения
клиенту требуется выполнить достаточно много действий, скрытых от конечного
пользователя.
Зачем постоянно держать активное соединение. Есть тайм-аут на процесс установки соединения, а если соединение уже установилось, то оно может быть активным неделями. Поэтому некоторые пользователи не закрывают программы.
Когда вы уничтожаете объекты класса Connection, то поставщик данных ре-
ально не закрывает соединение с базой данных. Объект помечается как неисполь-
зуемый, и если в течение определенного времени клиент снова запросит подклю-
чение, то будет использоваться уже существующее соединение, которое было
помечено, как неиспользуемое.
Слайд 16ExecuteScalar
OleDbCommand command = connection.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM Peoples";
int number
= (int)command.ExecuteScalar();
MessageBox.Show(number.ToString());
Для выполнения SQL-команды в данном примере используется метод
ExecuteScalar(). Он
подходит для тех случаев, когда запрос возвращает только
одно значение. Наш запрос возвращает количество записей в таблице
Слайд 17Транзакции
Begin() — начать транзакцию;
Commit() — сохранить изменения, сделанные внутри
транзакции;
Rollback() — отменить изменения, т. е. откатить транзакцию
Для выполнения SQL-команды
в данном примере используется метод
ExecuteScalar(). Он подходит для тех случаев, когда запрос возвращает только
одно значение. Наш запрос возвращает количество записей в таблице
Слайд 18Наборы данных
Для выполнения запросов, возвращающих наборы данных, используется уже
знакомый нам
класс OleDbCommand. Его метод ExecuteReader() выполняет запрос и возвращает объект
класса OleDbDataReader, через который как раз и можно просмотреть весь набор данных результата.
Чтобы получить очередную строку данных результата, нужно вызвать метод
Read() класса OleDbDataReader. Этот метод возвращает булево значение, которое
определяет, прочиталась ли очередная строка. Если мы достигли конца набора
данных, то результатом вызова метода будет false.
метод GetValues()
GetBoolean() — возвращает значение поля в виде булева значения;
GetByte() — возвращает значение поля в виде байта;
GetChar() — возвращает значение поля в виде символа char;
GetDecimal() — возвращает значение поля в виде числа Decimal;
GetDouble() — возвращает значение поля в виде числа с плавающей точкой;
GetString() — возвращает значение поля в виде строки.
Слайд 19Запросы с параметрами
OleDbCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM
Peoples WHERE Фамилия LIKE ?";
command.Parameters.Add("@lastname", OleDbType.WChar, 50);
command.Parameters[0].Value = "Смирнов";
OleDbDataReader reader
= command.ExecuteReader();
command.CommandText =
"SELECT * FROM Peoples WHERE Фамилия LIKE @lastname";
command.Parameters.Add("@lastname", OleDbType.WChar, 50);
Слайд 20Отсоединенные данные
Хорошо было бы получить данные, закрыть соединение и спокойно
обра-
батывать результат. Это особенно важно при формировании отчетов, когда пользо-
ватель
может просматривать их долгое время. Это также удобно, когда пользова-
тель редактирует набор данных продолжительное время, а потом одной командой
заливает на сервер сделанные изменения.
Класс OleDbDataAdapter — это класс адаптера, который реализует все необхо-
димые методы для кэширования данных. Но он всего лишь провайдер, который
реализует действия по кэшированию. Хранилищем для кэша может выступать один из классов DataTable или DataSet.
Первый из них реализует кэш одной таблицы, а
второй является набором данных и может состоять из множества таблиц. Для этого
У класса DataSet есть свойство Tables, которое является коллекцией из таблиц
DataTable. Если ваш результат возвращает несколько наборов данных, то логичнее
было бы использовать для хранения данных класс DataSet. Мы будем использовать
именно его, как более универсальный
Слайд 21Отсоединенные данные
Вернемся к классу OleDbDataAdapter. Два основных его метода —
Fill() и
Update(). Первый метод позволяет скопировать все данные из результата
запроса в DataSet, а второй позволяет залить изменения обратно на сервер. При этом класс OleDbDataAdapter сам выполняет указанную команду, поэтому ее не нужно даже самостоятельно открывать.
OleDbCommand command = new OleDbCommand("SELECT * FROM Peoples");
command.Connection = connection;
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
connection.Close();
После этого соединение с сервером можно закрывать, оно больше не нужно.
Все данные находятся локально в наборе данных DataSet, и вы можете работать с
ними.
Слайд 22Отсоединенные данные
private BindingSource bindingSource = new BindingSource();
Класс BindingSource представляет собой
еще одного посредника, но на этот
раз между набором данных DataSet
и визуальными компонентами. В нашем случае визуальным компонентом будет сетка DataGridView, и чтобы сетка отобразила данные, нам как раз и нужен посредник в виде BindingSource.
AutoGenerateColumns = true
в сетке колонки будут сгенерированы автоматически