- •1. Язык программирования c# 3
- •2. Базовые элементы .Net Framework 67
- •3. ТЕхнология .Net Remoting 144
- •Введение
- •1. Язык программирования c#
- •1.1. Платформа .Net – обзор архитектуры
- •1.2. Язык c# - общие концепции синтаксиса
- •1.3. Система типов языка c#
- •1.4. Преобразования типов
- •1.5. Идентификаторы, ключевые слова и литералы
- •1.6. Объявление переменных, полей и констант
- •1.7. Выражения и операции
- •1.8. Операторы языка c#
- •1.9. Объявление и вызов методов
- •1.10. Массивы в c#
- •1.11. Работа с символами и строками в c#
- •1.12. Синтаксис объявления класса, Поля и методы класса
- •1.13. Свойства и индексаторы
- •1.14. Конструкторы класса и Жизненный цикл объекта
- •1.15. Наследование классов
- •1.16. Перегрузка операЦий
- •1.17. Делегаты
- •1.18. События
- •1.19. Интерфейсы
- •1.20. Структуры и перечисления
- •1.21. Пространства имен
- •1.22. Генерация и обработка исключительных ситуаций
- •1.23. Нововведения в языке c# 2.0
- •1.24. Обобщенные типы (generics)
- •2. Базовые элементы .Net Framework
- •2.1. Метаданные и механизм отражения
- •2.2. Пользовательские и встроенные атрибуты
- •2.3. Пространство имен system.Collections
- •2.4. Работа с файлами и директориями
- •2.5. Использование потоков данных
- •2.6. Сериализация
- •2.7. Сериализация объектов в нестандартном формате
- •2.8. Введение в xml
- •2.9. Работа с xml-документами в .Net framework
- •2.10. МНогопоточное программирование
- •2.11. Синхронизация потоков
- •2.12. Асинхронный вызов методов
- •2.13. Состав и взаимодействие сборок
- •2.14. Конфигурирование сборок
- •3. ТЕхнология .Net Remoting
- •3.1. Домены приложений
- •3.2. Архитектура .Net Remoting
- •3.3. Активация удаленных объектов и их время жизни
- •3.4. Программная настройка Remoting
- •3.5. Удаленные Объекты с клиентской активацией
- •3.6. Настройка Remoting при помощи конфигурационных файлов
- •3.7. Хостинг распределенных приложений
- •3.8. Объекты-сообщения
- •3.9. Пользовательские канальные приемники
- •4.1. Архитектура ado.Net
- •4.2. Учебная база cd Rent
- •4.3. Соединение с базой данных
- •4.4. Выполнение команд и запросов к базе данных
- •4.5. Чтение данных и объект DataReader
- •4.6. Параметризированные запросы
- •4.7. Рассоединенный набор данных
- •4.8. Заполнение Рассоединенного набора данных
- •4.9. Объект класса DataColumn – колонка таблицы
- •4.10. Объекты класса DataRow – строки таблицы
- •4.11. Работа с объектом класса DataTable
- •4.12. DataSet и схема рассоединенного набора данных
- •4.13. Типизированные DataSet
- •4.14. Поиск и фильтрация данных в DataSet
- •4.15. Класс DataView
- •4.16. СиНхронизация набора данных и базы
- •5.1. Архитектура и общие концепции asp.Net
- •5.2. Пример aspx-страницы. Структура страницы
- •5.3. Директивы страницы
- •5.4. Класс System.Web.Ui.Page. События страницы
- •5.5. Серверные элементы управления
- •5.6. Элементы управления Web Controls
- •5.7. Проверочные элементы управления
- •5.8. Списковые элементы управления
- •5.9. Связывание данных
- •5.11. Управление состояниями в web-приложениях
- •5.12. Кэширование
- •5.13. Безопасность в web-приложениях
- •5.14. Создание пользовательских элементов управления
- •Литература
4.4. Выполнение команд и запросов к базе данных
Работа с базой данных основана на выполнении запросов. Запросы принято классифицировать по следующей схеме:
1. Запросы, не возвращающие данных. Такие запросы часто называют командным (action query). Основных видов командных запросов два:
DML-запросы (Data Manipulation Language, язык управления данными). Они изменяют содержимое базы. Вот несколько примеров DML-запросов:
UPDATE Customers SET CompanyName = 'NewCompanyName'
WHERE CustomerID = 'ALF'
INSERT INTO Customers (CustomerID, CompanyName)
VALUES ('NewID', 'NewCustomer')
DELETE FROM Customers WHERE CustomerID = 'ALF'
DDL-запросы (Data Definition Language, язык определения данных). Эти запросы изменяют структуру БД:
CREATE TABLE Disks ([id] [int] NOT NULL,
[title] [varchar] (50) NOT NULL,
[artist_id] [int] NULL)
DROP PROCEDURE StoredProc
2. Запросы, возвращающие данные (select query). Эти запросы производят выборку данных из базы либо путем выполнения SQL-оператора SELECT, либо при помощи вызова хранимой процедуры, возвращающей некий результат (возможно, набор данных).
Для выполнения запросов любых типов в ADO.NET используются объекты класса Command (конкретное имя класса специфично для поставщика данных). Класс команды реализует интерфейс IDbCommand.
Для создания объекта Command существуют два основных способа. Первый – использование конструктора. Класс SqlCommand содержит три перегруженных конструктора: конструктор без параметров; конструктор, которому передается как параметр текст команды; конструктор, принимающий как параметры текст команды и объект-соединение:
SqlCommand cmd = new SqlCommand();
SqlCommand cmd1 = new SqlCommand("SELECT * FROM Artists");
SqlConnection con = new SqlConnection("Data Source=(local);" +
"Initial Catalog=CD_Rent;" +
"Integrated Security=SSPI");
SqlCommand cmd = new SqlCommand("SELECT * FROM Artists", con);
Второй способ – это создание команды на основе объекта Connection:
SqlConnection c = new SqlConnection();
SqlCommand cmd3 = c.CreateCommand();
В последнем случае команда автоматически связывается с соединением. Связь с соединением должна быть установлена для любой команды перед выполнением. В общем случае для этого используется свойство Connection:
SqlConnection c = new SqlConnection();
SqlCommand cmd = new SqlCommand();
cmd.Connection = c;
Свойство CommandText содержит текст команды, а свойство CommandType определяет, как следует понимать этот текст. Это свойство может принимать следующие значения:
CommandType.Text. Текст команды – это SQL-инструкции. Обычно такие команды передаются в базу без предварительной обработки (за исключением случаев передачи параметров). Этот тип команды устанавливается по умолчанию.
CommandType.StoredProcedure. Текст команды – это имя хранимой процедуры, которая находится в базе данных.
CommandType.TableDirect. Команда предназначена для извлечения из БД полной таблицы. Имя таблицы указывается в CommandText. Данный тип команд поддерживает только поставщик OLE DB.
Еще одну возможность для настройки команд предоставляет свойство CommandTimeout. Это время в секундах, в течение которого ожидается начало выполнения команды (по умолчанию – 30 секунд). Следует учитывать, что после начала выполнения команды данное свойство никакой роли не играет. Выполнение команды не прервется, даже если она будет получать данные из базы на протяжении, к примеру, одной минуты.
// Пример настройки команды
SqlConnection con = new SqlConnection();
con.ConnectionString = "Server=(local);Database=CD_Rent;" +
"Integrated Security=SSPI";
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM Artists";
// Следующую строку можно не писать
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 3;
За подготовкой команды следует ее выполнение. Естественно, до выполнения команда должна быть связана с соединением, и это соединение должно быть открыто. В ADO.NET существует несколько способов выполнения команд, которые отличаются лишь информацией, возвращаемой из БД. Ниже перечислены методы выполнения команд, поддерживаемые всеми поставщиками.
ExecuteNonQuery(). Этот метод применяется для запросов, не возвращающих данные. Метод возвращает суммарное число строк, добавленных, измененных или удаленных в результате выполнения команды. Если выполнялся DDL-запрос, метод возвращает значение -1.
ExecuteScalar(). Метод выполняет команду и возвращает первый столбец первой строки первого результирующего набора данных. Метод может быть полезен при выполнении запросов или хранимых процедур, возвращающих единственных результат.
ExecuteReader(). Этот метод выполняет команду и возвращает объект DataReader. Тип возвращаемого ридера соответствует поставщику. Метод ExecuteReader() используется, когда требуется получить набор данных из базы (например, как результат выполнения команды SELECT).
В качестве примера использования метода ExecuteScalar() приведем код, при помощи которого подсчитывается число записей в таблице Artists:
SqlConnection con = new SqlConnection();
con.ConnectionString = "Server=(local);Database=CD_Rent;" +
"Integrated Security=SSPI";
SqlCommand cmd =
new SqlCommand("SELECT COUNT(*) FROM Artists", con);
con.Open();
// Приведение типов необходимо, так как метод ExecuteScalar()
// возвращает значение типа object
int count = (int) cmd.ExecuteScalar();
con.Close();
Console.WriteLine(count);
Изменим в предыдущем примере единственную строку:
SqlCommand cmd = new SqlCommand("SELECT * FROM Artists", con);
Как видим, команда настроена на получение набора данных. Однако в результате выполнения кода примера получим на консоли число 1. Это первый элемент в первой колонке id.
Поставщик SQL Server поддерживает метод, возвращающий объект класса, производного от XmlReader. Это метод ExecuteXmlReader(). Метод поддерживается для SQL Server 2000 и более поздних версий и требует, чтобы возвращаемые запросом или хранимой процедурой данные были в формате XML:
SqlConnection con = new SqlConnection();
con.ConnectionString = . . .;
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM Artists FOR XML AUTO";
// Открыли соединение
con.Open();
// Получили XmlReader
XmlReader xml = cmd.ExecuteXmlReader();
// Здесь как-то читаем и обрабатываем XML-данные
. . .
// Закрываем соединение
con.Close();