
- •Лекция 4 «Работа с бд Microsoft sql Server без разрыва соединения (связный уровень ado.Net)»
- •1. Создание соединения с источником данных
- •Конструкторы
- •Свойства
- •События
- •2. Работа с базой данных с помощью sql-запросов. Выборка, добавление, удаление и обновление данных
- •Конструкторы
- •Свойства
- •Сравнение DataReader и DataSet:
- •Чтение данных из DataReader:
- •Цикл по всем записям: Для перебора и вывода на консоль всех записей в DataReader, вы можете использовать цикл while, как показано в следующем примере кода:
- •Использование DataSets и DataReaders:
- •4. Отображение информации из базы данных с помощью элементов управления ListBox, ComboBox, ListView, DataGridView, DataTable.
2. Работа с базой данных с помощью sql-запросов. Выборка, добавление, удаление и обновление данных
2.1 Класс SqlCommand. Компоненты данных ADO.NET в Visual Studio инкапсулируют функциональные возможности доступа к БД различными способами, что помогает разрабатывать программные продукты значительно быстрее и с меньшим количеством ошибок. Команды данных абстрагируют задачу построения и выполнения инструкций SQL или хранимых процедур.
Тип SqlCommand является объектным представлением SQL-запроса, имени таблицы или хранимой процедуры, выполняемой над базой данных SQL Server. Вид команды указывается с помощью его свойства CommandType: Text (по умолчанию), TableDirect, StoredProcedure. Класс SqlCommand предоставляет также инструкцию Transact_SQL.
При создании экземпляра SqlCommand свойствам чтения и записи задаются начальные значения. Этот класс не наследуется.
Класс SqlCommand содержит следующие члены:
Конструкторы
SqlCommand() – инициализирует новый экземпляр класса SqlCommand.
SqlCommand(String) – инициализирует новый экземпляр класса SqlCommand с текстом запроса.
SqlCommand(String, SqlConnection) – инициализирует новый экземпляр класса SqlCommand текстом запроса и подключением SqlConnection.
SqlCommand(String, SqlConnection, SqlTransaction) – инициализирует новый экземпляр класса SqlCommand с текстом запроса, подключением SqlConnection и транзакцией SqlTransaction.
Свойства
1) Connection – подключение к базе данных. Можно использовать как существующее подключение, так и создавать новое.
2) CommandType – тип команды (запроса), который будет направляться к базе данных. Возможны следующие значения:
Text. Текстовая команда состоит из SQL-конструкции, направляемой к базе данных. Это значение используется по умолчанию.
StoredProcedure. Текстовая команда состоит из названия хранимой проце дуры.
TableDirect. Текстовая команда состоит из названия таблицы базы данных. В результате извлекается все содержимое таблицы. Эта команда аналогична текстовой команде SELECT * FROM Название_таблицы. Данная команда поддерживается только управляемым поставщиком OLE DB.
3) CommandText – собственно сам текст запроса. Он возвращает или задает инструкцию Transact_SQL, имя таблицы или хранимую процедуру, выполняемую для источника данных. (Переопределяет DbCommand.CommandText.)
4) CommandTimeout – возвращает или задает время ожидания перед завершением попытки выполнить команду и созданием ошибки.
5) Parameters – получает объект-коллекцию типов SqlParameterCollection, используемых для параметризованного запроса.
6) Transaction – получает или задает объект SqlTransaction, в рамках которого выполняется команда SqlCommand.
Методы
Cancel – пытается отменить выполнение SqlCommand. (Переопределяет DbCommand.Cancel().)
Clone – создает новый объект SqlCommand, являющийся копией текущего экземпляра.
CreateParameter – создает новый экземпляр объекта SqlParameter.
Dispose() – освобождает все ресурсы, используемые объектом Component. (Унаследовано от Component.)
GetType – возвращает объект Type для текущего экземпляра. (Унаследовано от Object.)
ExecuteReader() – Возвращает объект SqlDataReader поставщика данных для доступа к соответствующим данным в режиме однонаправленного чтения.
ExecuteNonQuery() –Направляет текст Sql-команды в хранилище данных.
2.2 Объект Command. Создание и инициализация. При определении объектов ADO .NET DataAdapter был назван адаптером, преобразователем, предназначенным для взаимодействия с базой данных. Это действительно так, однако если рассматривать взаимодействие с базой данных более глубоко, то выясняется, что в ADO .NET есть специализированный объект для выполнения запросов, называемый Command. Под запросами понимается выполнение SQL-конструкций или запуск хранимых процедур. Этот объект среда создает неявным образом в методе InitializeComponent.
Примеры создания объектов команд для представления SQL-запросов:
///////////// Создание объекта команды с помощью аргументов конструктора: ////////
string strSQL = "Select * From Друзья";
SqlCommand mycommand = new SqlCommand(strSQL, cn);
Console.WriteLine(mycommand.CommandText);
///////////// Создание объекта команды с помощью свойств класса SqlCommand : ////////
SqlCommand testcommand = new SqlCommand();
testcommand.Connection = cn;
testcommand.CommandText = "Select * [From Информация о друзьях]";
Console.WriteLine("Тип команды " + testcommand.CommandType);
Следует понимать, что в этот момент непосредственно SQL-запросы не предъявлены базе данных. Здесь только лишь подготовлены объекты команд для использования в будущем.
После создания активного соединения и SQL-команды следующим шагом является предъявление запроса источнику данных.
2.3 Командная строка SQL-запроса CommandText. Для извлечения таблиц и содержащихся в них данных используются SQL-запросы. Переменная CommandText содержит в себе SQL-запрос, синтаксис которого адаптирован для данного поставщика данных. Мы можем управлять извлечением данных, изменяя строку CommandText. Например, если на экранной форме приложения столбец «Код туриста» отображать не нужно, то SQL-запрос будет выглядеть следующим образом:
string CommandText = "SELECT Фамилия, Имя, Отчество FROM Туристы";
Выведем теперь все записи клиентов, имена которых начинаются на "О": string CommandText = "SELECT Фамилия, Имя, Отчество FROM Туристы where Имя like 'О%'";
Можно использовать все возможности языка манипулирования данными (DML) SQL для отбора данных и модификации строки CommandText для получения нужного результата.
Выборка, добавление, удаление и обновление данных с помощью SQL-запросов. Для модификации таблиц базы данных нужно вызвать метод ExecuteNonQuery() объекта команды, который выполняет вставки, обновления, и удаления в соответствии с форматом соотвествующей команды:
Вставка записи:
// Сбор информации о новом друге:
Console.WriteLine("Введите код друга!");
int kod = Int32.Parse(Console.ReadLine());
Console.WriteLine("Введите фамилию друга!");
string fam = Console.ReadLine();
Console.WriteLine("Введите отчество друга!");
string ot = Console.ReadLine();
Console.WriteLine("Введите имя друга!");
string imja = Console.ReadLine();
// Создание и формирование sql-запроса:
string sql = string.Format("Insert Into Друзья" + "([Код друга], Фамилия, Отчество, Имя) Values" + "('{0}','{1}','{2}','{3}')", kod, fam, ot, imja);
SqlCommand cmd = new SqlCommand(sql, cn);
Console.WriteLine(cmd.CommandText);
try { cmd.ExecuteNonQuery(); }
catch (Exception e) { Console.WriteLine(e.Message); }
Удаление записи: (если соответствующей записи нет в связанной таблице, она не удаляется!)
// Удаление записи с указанным номером друга:
Console.WriteLine("Введите код друга для удаления!");
int kod = Int32.Parse(Console.ReadLine());
string sql = string.Format("Delete from Друзья where [Код друга]={0}", kod);
SqlCommand cmd = new SqlCommand(sql, cn);
Console.WriteLine(cmd.CommandText);
try { cmd.ExecuteNonQuery(); }
catch (Exception e) { Console.WriteLine(e.Message); }
Обновление записи:
// Обновление записи:
Console.WriteLine("Введите код друга для обновления записи!");
int kod = Int32.Parse(Console.ReadLine());
Console.WriteLine("Введите новую фамилию друга!");
string fam = Console.ReadLine();
string sql = string.Format("Update Друзья Set Фамилия='{0}' where [Код друга]={1} ",fam,kod);
SqlCommand cmd = new SqlCommand(sql, cn);
Console.WriteLine(cmd.CommandText);
try { cmd.ExecuteNonQuery(); }
catch (Exception e) { Console.WriteLine(e.Message); }
Отметим, что оба подхода (визуальный и ручной) к созданию и использованию объектов ADO обладают своими областями применения. Для упрощения разработки и сопровождения визуальных форм проще использовать визуальный подход. При создании приложений, от которых требуется надежность, гибкость или отсутствие экранных форм (например, Web-сервис) лучше создавать объекты ADO вручную.
При визуальном подходе наряду с представлением данных в виде таблицы часто приходится использовать традиционные элементы интерфейса, такие как TextBox, Label и пр.
3. Вывод информации с использованием объекта чтения данных DataReader. Преимуществом использования объекта DataSet является то, что он дает отдаленный обзор базы данных. Для долгого использования приложений, это часто лучший подход. Для Веб-приложений разработчики обычно выполняют короткие и простые операции с каждым запросом, такие как отображение данных. Для таких операций разработчики не должны поддерживать объект DataSet. Или, когда большое количество данных воспроизведено, держать ли память открытой становится вопросом. Например, чтение 10000 строк из базы данных заставляет DataTable выделять и держать память для всех 10000 строк, для жизни таблицы. Если 1000 пользователей сделают это в одно и тоже время, использование памяти станет критическим. В таких случаях лучше использовать объект чтения данных DataReader. Есть два DataReader-объекта: SqlDataReader и OleDbDataReader.
Итак, улучшить производительность приложения можно с помощью DataReader, если нужно получить данные только в прямом направлении, т.е. только для чтения. С помощью DataReader можно получить следующий прирост производительности:
– сохранение памяти, которая будет потребляться DataSet; – экономия времени обработки, которая потребуются для создания и заполнения содержания DataSet;
Для решения таких ситуаций предназначен DataReader. Он служит для выполнения только чтения информации из базы данных в однонаправленный поток. Только одна запись в одну единицу времени существует в памяти. Поэтому объекты чтения данных используются только для SQL-операторов выборки данных. Объекты чтения данных (в отличие от объектов адаптеров данных) поддерживают открытое соединение с источником данных, пока вы явно не закроете соединение.
Существуют важные различия между записями DataReader и DataSet, которые выделены в таблице ниже.