Реферат: Учебно-методическое пособие по курсу «Информационные технологии» для студентов Института дополнительного образования специальности Прикладная информатика



Федеральное агенство по образованию

Ульяновский государственный университет

Факультет Информационных и Телекоммуникационных

Технологий




Л.Н. Полякова


Технологии ADO.NET и ASP.NET


Учебно-методическое пособие

по курсу

«Информационные технологии» для студентов Института дополнительного образования

специальности Прикладная информатика


Ульяновск

2006

П 54

ББК 32.973.2-018.2


Печатается по решению Ученого совета

факультета Информационных и

Телекоммуникационных Технологий

Ульяновского государственного университета


П 54 Полякова Л.Н.

Технологии ADO.NET и ASP.NET. Учебно-методическое пособие по курсу «Информационные технологии» для студентов Института дополнительного образования специальности Прикладная информатика, Ульяновск, 2006. 63 с.

Библ.: 8 назв.


Учебно-методическое пособие посвящено изучению технологии создания приложений баз данных в среде Microsoft Visual Studio.NET.

В пособии рассматривается модель доступа к данным ADO.NET, упрощающая создание как традиционных Windows-приложений, так и распределенных ASP-систем, работающих в сети Интернет.

Представлено описание базовых объектов доступа к данным, обеспечивающих прямой доступ к удаленному источнику данных и работу приложения в отсоединенном режиме. Показано применение элементов управления для отображения и модификации данных.

Построение Windows-и Web-приложений проиллюстрировано на конкретных примерах, реализованных на языке программирования C#.

Учебно-методическое пособие содержит список лабораторных работ, что способствует самостоятельному освоению материала.

Рекомендуется для студентов высших учебных заведений, изучающих современные информационные технологии.


Рецензенты

Д.т.н., профессор А.А.Смагин

К.п.н., доцент Жаркова Г.А.


© Полякова Л.Н.,2006

© УлГУ, 2006
СОДЕРЖАНИЕ
СОДЕРЖАНИЕ 4

Введение 6

Доступ к данным в ADO.NET 6

Структура данных ADO.NET 8

Обработка ошибок в .NET 9

Тема 1. Соединение с источником данных 10

Объявление объекта соединения 10

Создание соединения 10

Строка соединения 11

Открытие и закрытие соединения 13

Тема 2. Прямой доступ к данным 14

Работа с объектом DataCommand 14

Создание объекта DataCommand 15

Типы команд 15

Выполнение команд 16

Использование параметров 17

Объект DataReader 18

Тема 3. Отсоединенный набор данных Dataset 21

Структура объекта DataSet 21

Работа с объектом DataSet 22

Тема 4.Типизированные классы DataSet 25

Понятие типизированного класса 25

Создание типизированного класса DataSet 26

Использование типизированного класса 28

Тема 5. Объект DataAdapter 30

Заполнение объекта DataSet 31

Адаптеры данных и объекты Command 32

Тема 6. Обновление базы данных 34

Параллелизм в ADO.NET 35

Объект CommandBuilder 35

Тема 7. Доступ к данным в Windows-формах 37

Привязка данных в ADO.NET 37

Простая привязка данных 37

Сложная привязка данных к элементам управления 38

Привязка данных к элементу управления DataGrid 38

Пример создания Windows-приложения 39

Тема 8. Привязка данных типа «родитель-потомок» 42

Пример использования двух таблиц 42

Пример построения Windows-приложения с навигационной панелью 44

Тема 9. Привязка данных в ASP.NET 47

Пример создания Web-приложения 48

Создание объектов доступа к данным 49

Конфигурирование объекта DataGrid 51

Добавление возможности редактирования данных 51

Использование раскрывающегося списка 53

Создание обработчиков событий редактирования 54

Пример создания Web-приложения с гиперссылками 59

Тема 10. Аутентификация пользователя 60

Аутентификация пользователя в Windows-приложении 60

Аутентификация пользователя в Web-приложении 63

Список лабораторных работ 65

Литература 66
^

Введение Доступ к данным в ADO.NET
Одной из последних разработок Microsoft стала технология ActiveX Data Objects (ADO), обеспечивающая COM-оболочку для OLE DB. Так как код ADO легко встраивался в Web-страницы, технология ADO отлично интегрировалась с информационным сервером IIS (Internet Information Server) и ASP-страницами (Active server Page). Вскоре ADO стал стандартом для Web-узлов Internet. Небольшим Web-узлам ADO подходил как нельзя лучше, он был прост для понимания и легок для программирования. Но, к сожалению, ADO не смог справиться с уровнем нагрузки более крупных узлов. Множество Web-страниц регулярно обращались к базе данных для получения одной и той же информации – обнаружилась жесткая зависимость ADO от наличия соединения с базой данных.

ADO.NET –новый этап в технологии ActiveX Data Objects. Эта модель доступа к данным создана специально для использовании в Web-приложениях. Если раньше в ADO упор делался на постоянное соединение с базой данных, то в технологии использования ADO.NET изначально заложена возможность работы приложения в состоянии «разрыва» соединения с базой данных. В ADO.NET обеспечивается возможность работы со всеми совместимыми с OLE DB источниками данных как в локальных сетях в рамках традиционных Windows-приложений, так и в глобальных сетях Интернет в рамках Web- приложений.

В традиционных системах клиент-сервер при запуске приложения пользователем автоматически устанавливается связь с базой данных. которая поддерживается в «активном» состоянии до тех пор, пока приложение не будет закрыто. Такой метод работы с данными становится непрактичным, поскольку подобные приложения трудно масштабируются. Например, такая прикладная система может работать достаточно быстро и эффективно при наличии 8-10 пользователей, но она может быть полностью неработоспособной, если с ней начнут работать 100, 200 и более пользователей. Каждое открываемое соединение с базой данных «потребляет» достаточно много системных ресурсов сервера. В этом случае системные ресурсы заняты поддержкой и обслуживанием открытых соединений и не могут в должной степени поддерживать процессы непосредственной обработки данных.

При разработке прикладных систем в сети Интернет (Web-приложения) необходимо добиваться максимальной масштабируемости. Система должна работать одинаково эффективно как с малым, так и с большим числом пользователей.

По этой причине в ADO.NET используется модель работы пользователя в отрыве от источника данных. Приложения подключаются к базе данных только на небольшой промежуток времени. Соединение устанавливается только тогда, когда клиент с удаленного компьютера запрашивает на сервере данные. После того, как сервер подготовил необходимый набор данных, сформировал и отправил их клиенту в виде Web-страницы, связь приложения с сервером сразу же обрывается, и клиент просматривает полученную информацию уже не в связи с сервером. При работе в сети Интернет нет необходимости поддерживать постоянную «жизнеспособность» открытых соединений, поскольку неизвестно, будет ли конкретный клиент вообще далее взаимодействовать с источником данных. В таком случае целесообразнее сразу освобождать занимаемые серверные ресурсы, что обеспечит обслуживание большего количества пользователей.

Модель доступа к данным в ADO представлена на рис.1.


Рис.1.

В объектной модели ADO.NET можно выделить несколько уровней.

^ Уровень данных. Это по сути дела базовый уровень, на котором располагаются сами данные (например, таблицы базы данных MS SQL Server). На данном уровне обеспечивается физическое хранение информации на магнитных носителях и манипуляция данными на уровне исходных таблиц (выборка, сортировка, добавление, удаление, обновление).

^ Уровень бизнес - логики. Это набор объектов, определяющих, с какой базой данных предстоит установить связь и какие действия необходимо будет выполнить с содержащейся в ней информацией. Для установления связи с базами данных используется объект DataConnection. Для хранения команд, выполняющих какие-либо действия над данными, используется объект DataAdapter. И, наконец, если выполнялся процесс выборки информации из базы данных, для хранения результатов выборки используется объект DataSet.

^ Уровень приложения. Это набор объектов, позволяющих хранить и отображать данные на компьютере конечного пользователя. Для хранения информации используется объект DataSet, а для отображения данных имеется довольно большой набор элементов управления (DataGrid, TextBox, ComboBox, Label и т.п.). В Visual Studio .Net можно вести разработку двух типов приложений. В первую очередь это традиционные Windows-приложения (на основе Windows-форм), которые реализованы в виде exe-файлов, запускаемых на компьютере пользователя. И, конечно, Web-приложения (на основе Web-форм), которые работают в оболочке браузера. Для хранения данных на уровне обоих типов приложений используется объект DataSet. Обмен данными между приложениями и уровнем бизнес-логики происходит с использованием формата XML, а средой передачи данных служат либо локальная сеть (Интранет), либо глобальная сеть (Интернет).

ADO.NET – это библиотека .NET классов, которые позволяют подсоединяться к данным и манипулировать ими.

С целью разграничения функциональности классов ADO.NET они рассредоточены по различным пространствам имен. В ADO.NET пространства имен используются для отделения различных частей модели управляемого поставщика данных. Пространство имен System.Data включает в себя общие структуры данных, не зависящие от конкретного поставщика. В него входит класс DataSet и целое семейство связанных с ним классов (DataTable, DataColumn, DataRow, DataRelation, Constraint и т.п.). Каждый управляемый поставщик имеет свое собственное пространство имен. Так, управляемый поставщик SQL Server находится в пространстве имен System.Data.SqlClient, управляемый поставщик OLE DB - в пространстве имен System.Data.OleDb, управляемый поставщик ODBC – в пространстве имен System.Data.Odbc.

^ Структура данных ADO.NET
В ADO.NET есть два основных способа, обеспечивающих взаимодействие приложения с данными: использование набора данных (объект DataSet) и работа непосредственно с элементами базы данных: таблицами, представлениями, хранимыми процедурами и т.п. (объект DataCommand).

В «отсоединенной» модели работы с данными на основе DataSet разработчик создает в памяти компьютера некоторое пустое хранилище, загружает его данными, используя адаптер данных (объект DataAdapter), работает с этой информацией (сортирует, фильтрует, изменяет), затем, по мере необходимости, через тот же адаптер данных, возвращает все изменения в исходную базу данных.

В качестве альтернативы можно работать непосредственно с базой данных. В этой модели используется объект DataCommand, в котором содержится SQL-запрос или имя хранимой процедуры. Команда запускается на выполнение, и если команда не возвращает результата (например, удаление записей), то все действия команды выполняются непосредственно над объектами базы данных (например, удаляется запись из таблицы). Если в результате работы команды из базы данных возвращается набор записей, то используется объект DataReader для выборки данных. В некоторых случаях задача вообще не решается путем использования набора данных. Например, если требуется создать объект базы данных (типа таблица), то это можно сделать только с помощью команд (объектов DataCommand).
^ Обработка ошибок в .NET
При возникновении ошибки платформа .NET генерирует исключение. Смысл обработки исключений заключается в том, что при неудачной попытке что-то выполнить процесс генерирует объект исключения, который может быть перехвачен вызывающим кодом. Для перехвата исключений и их обработки в среде .NET предусмотрена структура try- catch- finally :

Например:

try

{

// попытка соединения с БД



MessageBox.Show("Успешное соединение ODBC!");

}

catch(Exception ex)

{



// если исключение было передано этому фрагменту кода,

// значит, возникло исключение, о чем необходимо сообщить

// пользователю

MessageBox.Show("Соединения нет!"+ex.Message);

}

finally

{



// этот фрагмент кода выполняется вне зависимости от того,

// было сгенерирована исключение или нет

}
^ Тема 1. Соединение с источником данных
Для перемещения данных между их постоянным хранилищем и приложением в первую очередь необходимо создать соединение с источником данных (Connection). В арсенале ADO.NET для этих целей имеется ряд объектов:

SQLConnection – объект, позволяющий создать соединение с базами данных MS SQL Server;

OleDbConnection – объект, позволяющий создать соединение с любым источником данных (простые текстовые файлы, электронные таблицы, базы данных) через OLE DB;

OdbcConnection –объект, позволяющий создать соединение с ODBC-источниками данных.

Жизненный цикл объекта Connection состоит из таких этапов как: объявление объекта соединения; создание объекта соединения; определение строки соединения; использование соединения, например, для создания команды; открытие соединения; выполнение команды; закрытие соединения; обработка полученных данных; изменение команды; повторное открытие соединения; выполнение команды; закрытие соединения.
^ Объявление объекта соединения
Пример объявления соединений показан в листинге 1.1.

Листинг 1.1.

public class Form1 : System.Windows.Forms.Form

{

private System.Data.SqlClient.SqlConnection sqlConnection1;

private System.Data.OleDb.OleDbConnection oleDbConnection1;

private System.Data.Odbc.OdbcConnection odbcConnection1;

private System.Data.Odbc.OdbcConnection odbcConnection2;



}
^ Создание соединения
Операторы создания объектов соединения помещаются в блок инициализации, как показано в листинге 1.2.

Листинг 1.2.

private void InitializeComponent()

{

this.sqlConnection1 = new System.Data.SqlClient.SqlConnection();

this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection();

this.odbcConnection1 = new System.Data.Odbc.OdbcConnection();

this.odbcConnection2 = new System.Data.Odbc.OdbcConnection();



}
^ Строка соединения
Первое свойство объекта соединения, которое необходимо определить в блоке инициализации для установления связи с базой данных – это строка соединения ConnectionString. В строке соединения управляемых поставщиков необходимо, как минимум, указать местоположение базы данных и требуемую аутентификационную информацию. Помимо этого, каждый поставщик данных определяет дополнительные параметры соединения. Если в строке соединения не указаны значения всех возможных параметров, они считаются установленными по умолчанию.


^ Строки соединения управляемого поставщика SQL Server

Строки соединения управляемого поставщика SQL Server содержат множество параметров, однако наиболее часто используются только некоторые из них. Самыми распространенными из них являются:

Data Source – имя сервера баз данных;

Initial Catalog – база данных, находящаяся на сервере;

User ID – идентификатор пользователя, который должен применяться для аутентификации пользователя на сервере баз данных;

PWD- пароль, который должен применяться для аутентификации пользователя на сервере баз данных;

Например, строка соединения с базой данных “basa_user”, расположенной на MS SQL Server с именем “ITS-SERVER” для пользователя с именем “UserA” и паролем “123” будет выглядеть следующим образом:


this.sqlConnection1.ConnectionString = "user id=usera;data source=\"ITS-SERVER\";initial catalog=basa_user;pwd=123";


Строки соединения управляемого поставщика OLE DB

Строки соединения управляемого поставщика OLE DB похожи на строки соединения SQL Server. Все параметры строки соединения, за исключением параметра Provider (Поставщик), определяются специфическим поставщиком OLE DB. В качестве значений параметра Provider могут быть использованы такие значения как: SQLOLEDB.1- для SQL Server; Microsoft.Jet.OLEDB.4.0 – для Microsoft Access; PostgreSQL – для базы данных PostgreSQL. Приведем пример строки соединения для MS SQL Server:

this.oleDbConnection1.ConnectionString = @"User ID=usera;Data Source=""ITS-SERVER"";Initial Catalog=basa_user; Provider= ""SQLOLEDB.1"";pwd=123";


Строки соединения управляемого поставщика ODBC

Строки соединения управляемого поставщика ODBC немного отличаются от строк соединения SQL Server или OLE DB. Управляемый поставщик ODBC поддерживает два различных метода создания строки соединения:

Создание строки соединения на основе имени источника данных (Data Source Name DSN);

Использование динамических строк соединения.

Недостаток использования DSN заключается в том, что каждый компьютер должен либо быть специально настроенным, либо иметь доступ к DSN-файлам. В частности, это бывает проблематичным в таких системах, как кластер Web-серверов. С другой стороны, использование DSN позволяет сохранить определенный контроль над строками соединения. Так, если меняется местоположение сервера или аутентификационная информация, разработчику придется изменить всего лишь атрибуты DSN, а не программный код. Атрибуты DSN можно использовать также для динамического генерирования информации о соединении. В этом случае параметры строки соединения, такие как DRIVER и SERVER, можно указать непосредственно в строке соединения, а не прятать их в атрибуте DSN.

Например, строка соединения на основе имени источника данных может выглядеть так:


this.odbcConnection1.ConnectionString = "UID=usera;DSN=stud;PWD=123";


а динамическая строка соединения с тем же источником данных выглядит следующим образом:


this.odbcConnection2.ConnectionString = "UID=usera;DRIVER=SQL Server;PWD=123;SERVER=ITS-SERVER";
^ Открытие и закрытие соединения
Объекты Connection имеют два базовых метода для открытия и закрытия соединения (Open и Close). Пример использования данных методов приведен в листинге 1.3.

Листинг 1.3.

private void Form1_Load(object sender, System.EventArgs e)

{

try

{

this.sqlConnection1.Open();

MessageBox.Show("Успешное SQL соединение");

this.sqlConnection1.Close();

}

catch(Exception ex)

{

MessageBox.Show("Нет SQL соединения"+ex.Message);

}

try

{

this.oleDbConnection1.Open();

MessageBox.Show("Успешное OLE DB соединение");

this.oleDbConnection1.Close();

}

catch(Exception ex)

{

MessageBox.Show("Нет OLE DB соединения"+ex.Message);

}

try

{

this.odbcConnection1.Open();

MessageBox.Show("Успешное ODBC1 соединение");

this.odbcConnection1.Close();

}

catch(Exception ex)

{

MessageBox.Show("Нет ODBC1 соединения"+ex.Message);

}

try

{

this.odbcConnection2.Open();

MessageBox.Show("Успешное ODBC2 соединение");

this.odbcConnection2.Close();

}

catch(Exception ex)

{

MessageBox.Show("Нет ODBC2 соединения"+ex.Message);

}

}
^ Тема 2. Прямой доступ к данным Работа с объектом DataCommand
Для выполнения основных задач, связанных со взаимодействием с базами данных, можно использовать объекты команд. Команда данных содержит ссылку на SQL-запрос или хранимую процедуру, которые собственно и реализуют конкретные действия. Команда данных – это экземпляр класса System.Data.Odbc.OdbcCommand или System.Data.OleDb. OleDbCommand или System.Data.SqlClient.SqlCommand.

С использованием объекта DataCommand в приложении можно выполнять следующие действия:

Исполнять команды SELECT, которые возвращают набор записей. Причем результат выборки можно обрабатывать непосредственно, без его загрузки в набор данных DataSet. Для чтения результатов используется объект DataReader, который работает в режиме «только чтение, только вперед» и может быть связан с компонентом визуального отображения данных. Эти объекты полезно использовать в тех случаях, когда имеет место ограничение на ресурсы памяти или требуется высокая скорость загрузки данных.

Выполнять команды, обеспечивающие создание, редактирование, удаление объектов базы данных (например, таблиц, хранимых процедур и т.п.).

Выполнять команды, обеспечивающие получение информации из каталогов баз данных.

Выполнять динамические SQL-команды, позволяющие модифицировать, вставлять или удалять записи непосредственно в базе данных, вместо того, чтобы редактировать таблицы набора данных DataSet, а затем копировать эти изменения в базу данных.

Выполнять команды, которые возвращают скалярное, то есть единственное значение.

Выполнять команды, которые возвращают данные из базы данных SQL Server в формате XML. Эта возможность используется в Интернет- приложениях. Например, когда нужно выполнить запрос и получить данные в формате XML, чтобы преобразовать данные к HTML-формату и затем отправить их браузеру.
^ Создание объекта DataCommand
Существует два основных способа создания объекта DataCommand. Во-первых, можно воспользоваться стандартным синтаксисом создания объекта команды, как показано в листинге 2.1.

Листинг 2.1.

System.Data.Odbc.OdbcConnection con1;// соединение

System.Data.Odbc.OdbcCommand cmd1;//команда



cmd1=new System.Data.Odbc.OdbcCommand();

Во-вторых, объект команды можно создать на основе объекта Connection (листинг 2.2).

Листинг 2.2.

System.Data.Odbc.OdbcConnection con1;// соединение

System.Data.Odbc.OdbcCommand cmd2; //команда



cmd2=con1.CreateCommand();
^ Типы команд
Команда – мощный инструмент, позволяющий проводить сложные операции с базой данных. В ADO.NET существует три типа команд:

Text – текстовая команда состоит из SQL-инструкций, указывающих управляемому поставщику на необходимость выполнения определенных действий на уровне базы данных. Текстовые команды передаются в базу данных без предварительной обработки, за исключением случаев передачи параметров;

StoredProcedure – хранимая процедура; эта команда вызывает процедуру, которая хранится в самой базе данных;

TableDirect – команда такого типа предназначена для извлечения из базы данных полной таблицы.

Тип команды устанавливается в свойстве CommandType, которое по умолчанию имеет значение Text, а сам текст команды прописывается в свойстве CommandText. Например:

Листинг 2.3.

cmd1=new System.Data.Odbc.OdbcCommand();

cmd1.Connection=con1;

cmd1.CommandText="DELETE FROM студент

WHERE номер_студента=377";
^ Выполнение команд
За подготовкой команды следует ее выполнение. В ADO.NET существует несколько способов выполнения команд, которые отличаются лишь информацией, возвращаемой из базы данных. Ниже приведены методы выполнения команд, поддерживаемые всеми управляемыми поставщиками:

ExecuteNonQuery() – этот метод применяется для выполнения команд, которые не должны возвращать результирующий набор данных. Так как при вызове данного метода возвращается число строк, добавленных, измененных или удаленных в результате выполнения команды, он может использоваться в качестве индикатора успешного выполнения команды;

ExecuteScalar()- этот метод выполняет команду и возвращает первый столбец первой строки первого результирующего набора данных. Данный метод может быть полезен для извлечения из базы данных итоговой информации; количества, максимального или минимального значения, итоговой суммы или среднего значения;

ExecuteReader() – этот метод выполняет команду и возвращает объект DataReader, представляющий собой однонаправленный поток записей базы данных.

Использование метода ExecuteNonQuery() показано в листинге 2.4.

Листинг 2.4.

System.Data.Odbc.OdbcConnection con1;// соединение

System.Data.Odbc.OdbcCommand cmd1;//команда

System.Data.Odbc.OdbcCommand cmd2; //команда



cmd1=new System.Data.Odbc.OdbcCommand();

cmd1.Connection=con1;

cmd1.CommandText="DELETE FROM студент

WHERE номер_студента=377";

try

{

cmd1.ExecuteNonQuery();

MessageBox.Show("Успешное удаление!");

}

catch(Exception ex)

{

MessageBox.Show("Удаление не удалось!"+ex.Message);

}


cmd1.CommandText="UPDATE студент SET стипендия=2000

WHERE номер_студента=375";

try

{

cmd1.ExecuteNonQuery();

MessageBox.Show("Успешное изменение!");

}

catch(Exception ex)

{

MessageBox.Show("Изменение не удалось!"+ex.Message);

}

cmd1.CommandText="INSERT INTO студент

VALUES(2,'Николаев', 'ИС-24',4000,'6.01.2005')";

try

{

cmd1.ExecuteNonQuery();

MessageBox.Show("Успешная вставка!");

}

catch(Exception ex)

{

MessageBox.Show("Вставка не удалась!"+ex.Message);

}

cmd1.Dispose();

Использование метода ExecuteScalar() показано в листинге 2.5.

Листинг 2.5.

System.Data.Odbc.OdbcCommand cmd=

new System.Data.Odbc.OdbcCommand("SELECT MAX(стипендия)

FROM студент",con1);…

int result= (int)cmd.ExecuteScalar();
^ Использование параметров
Если в приложении используется объект DataCommand, который работает непосредственно с элементами базы данных, то выполняемые SQL-запросы и хранимые процедуры обычно требуют параметров. Перед выполнением таких запросов необходимо определить значения параметров. Объект DataCommand поддерживает коллекцию Parameters. Прежде чем выполнить команду, необходимо установить значение для каждого параметра команды, как показано в листинге 2.6.

Листинг 2.6.

cmd2.CommandText="DELETE FROM студент

WHERE номер_студента=?";

cmd2.Parameters.Add("p1",System.Data.Odbc.OdbcType.Int);

cmd2.Parameters["p1"].Value=337;

try

{

cmd2.ExecuteNonQuery();

MessageBox.Show("Успешное удаление!");

}

catch(Exception ex)

{

MessageBox.Show("Удаление не удалось!"+ex.Message);

}

Следует отметить, что формат параметризованных запросов отличается для разных управляемых поставщиков. Если в синтаксисе параметризованного запроса в качестве параметра в основном применяется знак вопроса «?», то для управляемого поставщика SQL Server используется @имя_параметра, как показано в листинге 2.7.

Листинг 2.7.

cmd2.CommandText="DELETE FROM студент

WHERE номер_студента=@p1";

cmd2.Parameters.Add("@p1",System.Data.Odbc.OdbcType.Int);

cmd2.Parameters["@p1"].Value=337;

Альтернатива использованию объектов параметров

Процесс создания команды может быть сведен к созданию обычных строк, как показано в листинге 2.8.

Листинг 2.8.

int t=370;

cmd.CommandText=string.Format("DELETE FROM студент

WHERE номер_студента={0}",t);

cmd.ExecuteNonQuery();
^ Объект DataReader
Функциональные возможности объекта DataReader включают режим однонаправленного курсора. Механизм чтения данных объекта DataReader является устойчивым к ошибкам, позволяя за один шаг считать текущую запись в память и проверить наличие индикатора конца записи. Наиболее эффективно объект DataReader применяется при получении результатов выполнения запроса и их передаче на дальнейшую обработку.

В отличие от большинства других интерфейсов доступа к данным, в которых для считывания и изменения данных используется один и тот объект, в ADO.NET операции чтения и изменения данных разделены. Исключительно для чтения данных предназначен основной объект ADO.NET DataReader.

Объект DataReader обеспечивает доступ к данным, извлеченным в результате выполнения SQL-запроса, в режиме только для чтения. Объект DataReader представлен соответствующим классом: System.Data. Odbc.OdbcDataReader, System.Data.OleDb.OleDbDataReader или System. Data.SqlClient.SqlDataReader.

На всем протяжении существования объекта DataReader при чтении или при просмотре строк соединение должно оставаться открытым. Так как при работе с объектом DataReader соединение остается открытым, он может не извлекать за один раз все данные, полученные в результате выполнения запроса.

^ Создание объекта DataReader

Объект DataReader не может быть создан напрямую из клиентского кода – он создается объектом команды во время ее выполнения с помощью метода ExecuteReader(). Пример создания объекта Datareader показан в листинге 2.9.

Листинг 2.9.

System.Data.Odbc.OdbcDataReader rdr;



cmd1.CommandText="SELECT * FROM студент";

try

{

rdr=cmd1.ExecuteReader();

MessageBox.Show("Успешная выборка!");

}

catch(Exception ex)

{

MessageBox.Show("Выборка не удалась!"+ex.Message);

}

Для перемещения по результирующему набору данных предназначен метод ^ Read(). Метод Read() обязательно должен быть вызван один раз еще до считывания первой записи. Благодаря этому объект DataReader более устойчив к ошибкам, так как перемещение строкового курсора и проверка того, достигнут ли конец результирующего набора данных, производится в одном операторе. По достижению конца результирующего набора данных метод Read() возвратит false. Объект DataReader позволяет осуществлять доступ к отдельным столбцам, представляя результирующий набор данных в виде массива. Посредством соответствующего индексатора ([]) указывается либо порядковый номер столбца, либо его имя, например, как показано в листинге 2.10.

Листинг 2.10.

cmd=con.CreateCommand();

cmd.CommandText="SELECT номер_студента, фамилия, группа,

стипендия, дата FROM студент";

rdr=cmd.ExecuteReader();

rdr.Read();

textBox1.Text=rdr[0].ToString();

textBox2.Text=rdr[1].ToString();

textBox3.Text=rdr["группа"].ToString();

textBox4.Text=rdr[3].ToString();

textBox5.Text=rdr[4].ToString();

Поскольку индексатор возвращает объект, его можно привести к типу столбца или вызвать для этого один из get-методов объекта DataReader, обеспечивающих безопасность типов, как показано в листинге 2.11.

Листинг 2.11.

cmd=con.CreateCommand();

cmd.CommandText="SELECT номер_студента, фамилия, группа,

стипендия, дата FROM студент";

rdr=cmd.ExecuteReader();

rdr.Read();

int v0=rdr.GetInt32(0);

textBox1.Text=v0.ToString();

string v1=rdr.GetString(1);

textBox2.Text=v1;

string v2=rdr.GetString(2);

textBox3.Text=v2;

int v3=rdr.GetInt32(3);

textBox4.Text=v3.ToString();

DateTime v4=rdr.GetDateTime(4);

textBox5.Text=v4.ToString();

Обеспечивающие безопасность типов get-методы не производят никаких преобразований – они просто осуществляют привидение типа. Все get-методы, обеспечивающие безопасность типов, требуют передачи в качестве параметра порядкового номера столбца, что, естественно, менее удобно, чем использование его имени.

В листинге 2.11 показана также привязка данных объекта DataReader к элементам управления Windows-формы типа TextBox - текстовое поле. В листинге 2.12 показана привязка данных объекта DataReader к списку.

Листинг 2.12.

while(rdr.Read())

{

this.listBox1.Items.Add(rdr[1].ToString());

}

^ Тема 3. Отсоединенный набор данных Dataset
Объект DataSet – это:

Набор информации, извлеченной из базы данных; доступ к этому набору осуществляется в отсоединенном режиме;

База данных, расположенная в памяти;

Сложная реляционная структура данных со встроенной поддержкой XML-сериализации.

Роль объекта DataSet в ADO.NET заключается в предоставлении отсоединенного хранилища информации, извлеченной из базы данных, и в обеспечении для .NET возможностей базы данных, хранимой в памяти. Объект DataSet – это коллекция структур данных, использующихся для организации отсоединенного хранилища информации.
^ Структура объекта DataSet
Объект DataSet состоит из нескольких связанных друг с другом структур данных. Концептуально он представляет собой полный набор реляционной информации. Внутри объекта Dataset могут храниться пять объектов:

DataTable - набор данных, организованный в столбцы и строки;

DataRow – коллекция данных, которая представляет собой одну строку таблицы DataTable, объект DataRow является фактическим хранилищем данных;

DataColumn – коллекция правил, описывающая данные, которые можно хранить в объектах DataRow;

Constraint – данный объект используется для определения бизнес – правил объекта DataTable и задает допустимость хранения определенных данных в объекте DataTable;

DataRelation –описание связей между объектами DataTable.

Так как объект DataSet не связан с базой данных, его можно воспринимать как реляционное хранилище данных.
^ Работа с объектом DataSet
Данные, которые хранятся внутри объекта DataSet, содержат не только информацию, необходимую для поддержки отсоединенного кэша базы данных, но также предоставляют возможность перемещаться по нему как по некоторой иерархической структуре.

Основным предназначением объекта ^ DataSet является хранение и изменение данных. Объекты DataRow являются основным хранилищем данных внутри объекта DataSet. Объект DataRow содержит массив значений, представляющих собой строку объекта DataTable. Объекты DataRow доступны из объекта DataTable через свойство Rows.

Заполнение объекта DataSet

В отличие от предыдущих уровней доступа к данным, объект DataSet не имеет никакого внутреннего представления об источнике данных. Таким образом, объект DataSet оказывается отсоединенным не только от данных, но и от информации об их происхождении. Следовательно, необходимо иметь объект, позволяющий соединить объект DataSet и источник данных. Для заполнения объекта DataSet данными существует три метода:

С помощью объекта DataAdapter (при этом информация, как правило, извлекается из базы данных);

На основе XML-документа;

Программным путем.

Использование объекта DataAdapter для заполнения объекта DataSet данными представлено в теме 5.


Выборка строки

Пусть в наборе данных с именем ds1 существует две таблицы с именами "Таб_студ" и "Таб_гр". В таблицы "Таб_студ" и "Таб_гр" с помощью объекта DataAdapter внесены записи таблиц Студент и Группа, расположенных на сервере базы данных. Пример выборки данных из объекта DataSet по номеру строки в текстовые поля представлен в листинге 3.1.

Листинг 3.1.

int n=10;

DataRow r=this.ds1.Tables["Таб_студ"].Rows[n];

textBox1.Text=r["номер_студента"].ToString();

textBox2.Text=r["фамилия"].ToString();

textBox3.Text=r["группа"].ToString();

textBox4.Text=r["стипендия"].ToString();

textBox5.Text=r["дата"].ToString();

Добавление строки

Для создания новой строки можно использовать соответствующие методы (NewRow() и Add()) объекта DataTable. Следует отметить, что метод NewRow() сам по себе не добавляет строку в объект DataTable. Для этого необходимо вызвать метод Add(), передав ему в качестве параметра объект строки. Пример добавления строки в объект DataSet приведен в листинге 3.2.

Листинг 3.2.

// вставить запись

DataRow r=ds1.Tables["Таб_студ"].NewRow();

r["номер_студента"]=1;

r["фамилия"]="Семенов";

r["группа"]="ИС-41";

r["стипендия"]=1500;

r["дата"]="6.10.05";

ds1.Tables["Таб_студ"].Rows.Add(r);


Удаление строки

При использовании отсоединенных данных к удалению строки из коллекции предъявляется особое требование: строка должна продолжать существовать до тех пор, пока хранилище данных не будет обновлено с помощью объекта DataSet. Удаление строки может быть осуществлено, например, с помощью метода Delete() объекта DataRow. В этом случае строка удаляет себя сама. Пример удаления строки представлен в листинге 3.3.

Листинг 3.3.

int n=10;

DataRow r=this.ds1.Tables["Таб_студ"].Rows[n];

r.Delete();

При удалении строки можно воспользоваться диалоговым окном для подтверждения удаления, как показано в листинге 3.4.

Листинг 3.4.

int n=10;

DataRow r=this.ds1.Tables["Таб_студ"].Rows[n];

string s=MessageBox.Show("Удалить запись?","Внимание!", System.Windows.Forms.MessageBoxButtons.OKCancel).ToString();

if (s=="OK")

{

try

{

r.Delete();

MessageBox.Show("Запись удалена!");

}

catch(Exception ex)

{

MessageBox.Show("Запись не удалена! "+ex.Message);

}

}

Изменение строки

Индексаторы класса DataRow позволяют установить новые значения столбцов строки, например:

r["фамилия"]=”Иванов”;

Однако при определении нового значения столбца объект ^ DataRow сгенерирует исключение в том случае, если это значение будет конфликтовать со свойством DataType объекта DataColumn.

Существуют ситуации, в которых изменения в конкретную строку DataRow необходимо вносить параллельно. Обычно это делается тогда, когда одно изменение приводит к нарушению некоторого ограничения или когда необходимо иметь возможность отмены изменений перед их внесением в базу данных. В этом случае используются методы BeginEdit(), EndEdit() и CancelEdit() класса DataRow. Как только будет вызван метод BeginEdit(), изменения перестанут отражаться на объекте DataRow до тех пор, пока не будет вызван метод EndEdit(). Если внесенные изменения окажутся ошибочными, можно вызвать метод CancelEdit(), который вернет строку в первоначальное состояние (состояние, в котором она находилась до вызова метода BeginEdit()). Пример изменения строки показан в листинге 3.5.

Листинг 3.5.

//изменить запись

int n=10;

DataRow r=this.ds1.Tables["Таб_студ"].Rows[n];

r.BeginEdit();

r["фамилия"]=”Иванов”;

r["группа"]=”ИС-11”;

r["стипендия"]=2000;

r["дата"]=”1.01.05”;

r.EndEdit();


Определение схемы объекта DataSet

Предназначение схемы базы данных заключается в определении правил, которым должна соответствовать хранящаяся в базе данных информация. Создание схемы объекта DataSet возможно программным путем.

Пример создания первичных ключей приведен в листинге 3.6. Здесь же показано создание отношения между родительской таблицей "Таб_гр" и дочерней таблицей "Таб_студ" по полю "группа".

Листинг 3.6.

DataTable gr=ds.Tables["Таб_гр"];

DataTable st=ds.Tables["Таб_студ"];

gr.PrimaryKey=new DataColumn[]{gr.Columns["группа"]};

st.PrimaryKey=new DataColumn[]{st.Columns["номер_студента"]};

ds.Relations.Add("gr_st",ds.Tables["Таб_гр"].Columns["группа"],

ds.Tables["Таб_студ"].Columns["группа"],true);


Первым параметром в методе Relations.Add() является имя отношения. Следующие два параметра представляют собой имена столбцов родительской и дочерней таблиц соответственно. Наконец, последний параметр является булевой переменной, определяющей необходимость создания ограничений для этого отношения. При создании ограничения объекту DataSet сообщается, что каждое значение уникального ключа родительской таблицы должно присутствовать в дочернем объекте DataTable.

^ Тема 4.Типизированные классы DataSet По
еще рефераты
Еще работы по разное