- •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.6. Параметризированные запросы
Запросы к базе данных могут содержать параметры. Рассмотрим запрос со следующим текстом:
SELECT name FROM Artists WHERE id = @id
В данном примере параметром является @id, а запрос означает следующее: получить из таблицы Artists все значения колонки name таких записей, у которых колонка id равна параметру @id. Вот пример предыдущего запроса для поставщика OLE DB (маркером параметра является символ «?»):
SELECT name FROM Artists WHERE id = ?
Для работы с параметрами поставщики данных определяют особые классы (например, SqlParameter). Некоторые свойства параметров перечислены ниже (не каждый параметр требует определения всех свойств):
ParameterName. Имя параметра. У поставщика данных SQL Server имя любого параметра предваряется символом @. Другие поставщики могут не использовать специальных имен вовсе, а определять параметры по позиции.
DbType. Тип хранящихся в параметре данных. Перечисление DbType содержит элементы, которые можно использовать как значения данного свойства. Кроме этого, каждый поставщик имеет перечисления либо классы, более точно отражающие реальный тип данных СУБД. Например, поставщик SQL Server содержит перечисление SqlDbType.
Size. Свойство зависит от типа данных параметра и обычно используется для указания его максимальной длины. Например, для строковых типов (VarChar) свойство Size представляет максимальный размер строки. Значение по умолчанию определяется по свойству DbType. В случае числовых типов изменять это значение не требуется.
Direction. Данное свойство определяет способ передачи параметра хранимой процедуры. Его возможные значения – Input, Output, InputOutput и ReturnValue – представлены перечислением ParameterDirection. По умолчанию используется значение Input.
IsNullable. Это свойство определяет, может ли параметр принимать пустые значения. По умолчанию свойство установлено в false.
Value. Значение параметра. Для параметров типа Input и InputOutput это свойство должно быть установлено до выполнения команды, для параметров типа Output, InputOutput и ReturnValue значение свойства устанавливается в результате выполнения команды. Чтобы передать пустой входной параметр, нужно либо не устанавливать значение свойства Value, либо установить его равным DBNull.
Precision. Определяет число знаков после запятой, использующихся для представления значений параметра. По умолчанию имеет значение 0.
Scale. Определяет общее число десятичных разрядов для представления параметра.
SourceColumn и SourceVersion. Данные свойства определяют способ использования параметров с объектом DataAdapter и подробнее будут рассмотрены ниже.
Любой объект команды содержит свойство Parameters, представляющее коллекцию параметров. Для доступа к параметрам в коллекции используется строковый индекс (имя параметра) или целочисленный индекс (позиция параметра).
Чтобы создать параметр можно применить один из конструкторов типа, описывающего параметр. Имеется шесть перегруженных версий конструктора, позволяющих задать некоторые свойства параметра. После создания параметр помещается в коллекцию определенной команды:
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT name FROM Artists WHERE id = @id";
. . .
SqlParameter p = new SqlParameter();
p.ParameterName = "@id";
p.Direction = ParameterDirection.Input;
p.DbType = DbType.Int32;
cmd.Parameters.Add(p);
Для создания и добавления параметра часто достаточно воспользоваться одной из перегруженных версий метода Add() коллекции параметров:
cmd.Parameters.Add("@id", DbType.Int32);
Следующий пример показывает выборку данных из таблицы с использованием параметризированного запроса:
SqlConnection con = new SqlConnection();
con.ConnectionString = "Server=(local);Database=CD_Rent;" +
"Integrated Security=SSPI";
string s = "SELECT name FROM Artists WHERE id = @id";
SqlCommand cmd = new SqlCommand(s, con);
cmd.Parameters.Add("@id", DbType.Int32);
while (true) {
Console.Write("Input id: ");
cmd.Parameters["@id"].Value =
Int32.Parse(Console.ReadLine());
con.Open();
string name = (string)cmd.ExecuteScalar();
Console.WriteLine(name);
con.Close();
}
Заметим, что параметризированные запросы зачастую удобнее сформировать, воспользовавшись функциями для работы со строками (и такой метод более быстрый, чем работа с объектами-параметрами). Однако без параметров не обойтись, если речь заходит о вызове хранимой процедуры на сервере БД.
Пусть на сервере MS SQL Server описана хранимая процедура get_id:
CREATE PROCEDURE get_id @sp_name varchar(50) AS
RETURN (SELECT id FROM Artists WHERE name = @sp_name)
GO
Данная процедура получает в качестве параметра строку с именем исполнителя и возвращает идентификатор данной строки в таблице Artists1.
Следующий код работает с хранимой процедурой при помощи параметров:
// Создаем и настраиваем соединение
SqlConnection con = new SqlConnection();
con.ConnectionString = "Server=(local);Database=CD_Rent;" +
"Integrated Security=SSPI";
// Создаем команду, текст команды – имя хранимой процедуры
SqlCommand cmd = new SqlCommand("get_id", con);
// Требуется изменить тип команды
cmd.CommandType = CommandType.StoredProcedure;
// Создаем и настраиваем первый (входной) параметр
SqlParameter p1 = new SqlParameter();
p1.ParameterName = "@sp_name";
p1.DbType = DbType.String;
cmd.Parameters.Add(p1);
// Настраиваем параметр, соответствующий выходному значению
SqlParameter p2 = new SqlParameter();
// У такого параметра особое имя!
p2.ParameterName = "@RetVal";
p2.DbType = DbType.Int32;
p2.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(p2);
// Запрашиваем у пользователя информацию...
Console.Write("Input name to find the id: ");
cmd.Parameters["@sp_name"].Value = Console.ReadLine();
// ...и возвращаем ему результат
con.Open();
cmd.ExecuteNonQuery();
Console.WriteLine(cmd.Parameters["@RetVal"].Value);
con.Close();
Заметим, что для удобной работы с хранимыми процедурами в клиентском приложении часто описываются специальные методы-«оболочки». Создание подобного метода оставляем читателям в качестве упражнения.