
- •Лекция № 1. Информационные системы и базы данных.
- •1.5. Документация и методы ее формирования.
- •Лекция № 2. Информационные системы и базы данных. Субд. Определение базы данных.
- •Компоненты sql Server
- •Лекция № 3. Основы языка запросов sql.
- •3.1 Компоненты sql
- •Предложение Описание
- •Операции sql
- •3.2 Запрос на выборку
- •Лекция № 4. Основы языка запросов sql.
- •4.1. Удаление записей с помощью запроса
- •4.2 Добавление записей с помощью запроса
- •4.3 Запрос на обновление
- •4.4 Реализация операции соединения с помощью запроса
- •4.5. Реализация операции объединения с помощью запроса
- •Лекция № 5. Платформа .Net.
- •Лекция № 6. Знакомство с языком программирования с#.
- •Объектно-ориентированное программирование
- •Лек ция № 7. Создание клиентских приложений Windows.
- •Объекты ado.Net
- •Лек ция № 8. Создание клиентских приложений Windows. Подключение к бд
- •Команды для манипулирования данными
- •Параметры
- •Применение объекта DataReader
- •Модификация и обновление данных
- •Модификация данных
- •Связывание, просмотр и фильтрация данных
- •Литература
Применение объекта DataReader
Чтобы использовать объект Command с запросами, возвращающими несколько значений, следует обратиться к методу Execute Reader. Он возвращает объект DataReader DataReader — это упрощенный объект, обеспечивающий быстрое и эффективное последовательное однонаправленное чтение данных. Объект Data Reader позволяет перебирать записи результирующего набора, передавая нужные значения напрямую коду приложения. При этом DataSet намного эффективнее, но менее гибок по сравнению с DataAdapter. Данные, полученные через объект DataSet, доступны только для чтения, поэтому их нельзя модифицировать средствами DataSet. При этом данные разрешается просматривать только в одном направлении: нельзя вернуться к записи, прочитанной ранее. Кроме того, объект DataReader ориентирован на использование постоянных соединений и, пока он существует, требует монопольного доступа к активному соединению.
Объект DataReader нельзя создать напрямую, это делается путем вызова метода ExecuteReader объекта Command. Подобно другим членам классов провайдеров данных, у каждого класса DataProvider есть собственный класс DataReader. Объект OleDbCommand возвращает OleDbDataReader, а объект SqlCommand — Sql Data Reader,
При вызове метода ExecuteReader объект Command исполняет представленную им команду и создает объект DataReader соответствующего типа, который можно записать в переменную ссылочного типа.
Получив ссылку на объект DataReader, можно просматривать записи, загружая нужные данные в память. У нового объекта DataReader указатель чтения устанавливается на первую запись результирующего набора. Чтобы сделать ее доступной, следует вызвать метод Read. Если запись доступна, метод Read переводит указатель объекта DataReader к следующей записи и возвращает True (true), в противном случае метод Read возвращает False (false). Таким образом, метод Read используют для перебора записей в цикле While.
При чтении записи с помощью объекта DataReader значения отдельных полей доступны через индексатор или свойство по умолчанию в виде массива объектов, к элементам которого разрешается обращаться по индексу либо по имени поля.
Прочитав данные с помощью DataReader, следует вызвать метод Close, чтобы закрыть DataReader, в противном случае объект DataReader будет удерживать монопольный доступ к активному соединению, сделав его недоступным другим объектам. При вызове метода ExecuteReader, установив свойство Command Behavior в CloseConneciion, вы автоматически закроете соединение, не вызывая метод Close явно.
Если полученные строки предполагается сохранить в объекте DataTable, считывание данных выполняется проще – с помощью метода Load объекта DataTable.
Приведенный пример иллюстрирует применение метода ExecuteReader и запроса с параметрами.
DataTable dt = new DataTable();
using (SqlConnection cnn = new SqlConnection(
"Data Source=(local); Initial Catalog=var5sql;" +
" Integrated Security=true"))
{
SqlCommand cmd = new SqlCommand(
"select abon, TCHK_NAM from F107 where TCHK_NAM like @param union " +
" select abon, TCHK_NAM from f115 where TCHK_NAM like @param", cnn);
cmd.Add("@param", SqlDbType.VarChar).Value = textBox1.Text;
cnn.Open();
dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
}
dataGridView1.DataSource = dt;
Формирование запросов SQL во время выполнения
Иногда конструкция запроса SQL становится известной только в период выполнения. Например, запрос может использовать строку для поиска, введенную пользователем, или возвращать столбцы и таблицы, определенные программно в период выполнения. Для решения этих задач соответствующие команды создают, настраивают и исполняют в период выполнения. Сформированные таким образом команды называют динамическими запросами.
Основной шаг — формирование строки команды. Сначала пишут заготовку команды; при необходимости заменяют значения, которые должны быть вставлены в период выполнения, строковыми переменными; для объединения строк используют оператор конкатенации.
string cnnstr = ConfigurationManager.ConnectionStrings
["demoAdventureWorks"].ConnectionString;
SqlConnection cnn1 = new SqlConnection(cnnstr);
SqlCommand cmd1 = new SqlCommand(
"Select count(*) from HumanResources.Employee where ManagerId="
+ employeeIDTextBox.Text, cnn1);
cnn1.Open();
label1.Text = cmd1.ExecuteScalar().ToString();
Создание и настройка объекта DataAdapter
Объекты DataAdapter обеспечивают связь между источником данных и объектом DataSet, управляя обменом данных и контролируя их передачу. Одни приложения осуществляют одностороннюю передачу данных, а другим требуется не только извлекать, но и модифицировать данные источника. Объект DataAdapter способен извлекать данные, заполнять объекты DataSet и при необходимости обновлять содержимое источника данных.
Как правило, обменом данными в каждой паре объект DataTable набора DataSet— таблица БД управляет отдельный объект DataAdapter. В DataSet может быть несколько таблиц, поэтому для каждой, добавляемой к объекту DataSet, следует создавать собственный объект DataAdapter.
Существует три способа создания DataAdapter. перетаскиванием элемента БД из окна Server Explorer, при помощи нового мастера Data Adapter Configuration или ручным объявлением и настройкой этого объекта в коде.
Создание DataAdapter с помощью окна Server Explorer
Проще всего создать DataAdapter, воспользовавшись окном Server Explorer. Узел Data Connections дерева, отображаемого в окне Server Explorer, содержит все доступные соединения с данными в виде дочерних узлов Data Connection. Раскрыв узел соединения, вы получите дополнительные сведения о подключенной БД, в том числе список доступных таблиц, представлений и хранимых процедур. Чтобы создать объект DataAdapter, представляющий таблицу, просто перетащите таблицу из окна Server Explorer в окно дизайнера. Вы создадите объект DataAdapter соответствующего типа (SqlDataAdapter или OleDb DataAdapter) с корректными значениями свойств SelectComtnand, Update Command, InsertCommand и DeleteCommand.
Кроме того, предусмотрена настройка объекта DataAdapter, чтобы он возвращал подмножество столбцов таблицы. Для этого раскройте узел, представляющий таблицу, и выберите нужные столбцы, щелкая соответствующие элементы с нажатой клавишей Ctrl. Затем перетащите выбранные столбцы в окно дизайнера — вы получите объект DataAdapter, сконфигурированный для доступа к выбранным столбцам
Можно также создать новый объект DataAdapter, перетащив соответствующий объект DataAdapter с панели Toolbox в окно дизайнера, чтобы вызвать мастер Data Adapter Configuration.
Чтобы заполнить DataSet данными, следует вызвать метод Fill объекта DataAdapter. Этот метод исполняет команды, заданные свойством SelectCommand, на соединении, указанном свойством Connection, и заполняет DataSet данными, которые возвращает исполненная команда. Методу Fill необходимо передать целевой объект, которым может быть DataSet либо DataTable,
Приведенный пример иллюстрирует применение метода Fill. Свойство SelectCommand объекта DataAdapter содержит запрос с параметрами.
DataSet ds= new DataSet();
SqlDataAdapter da=new SqlDataAdapter();
SqlConnection cnn;
new SqlConnection("Data Source=(local); Initial Catalog=var5sql; Integrated Security=true");
da.SelectCommand = new SqlCommand( "select abon, TCHK_NAM from F107 where ”+ “TCHK_NAM like @param union select abon, TCHK_NAM from f115 where “+
“TCHK_NAM like @param");
da.SelectCommand.Connection = cnn;
da.SelectCommand.Parameters.Add("@param", SqlDbType.VarChar).Value = textBox1.Text;
cnn.Open();
ds.Clear();
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
cnn.Close();