Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по C_1.docx
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать

Сравнение DataReader и DataSet:

Свойство

DataReader

DataSet

Количество таблиц

Одна таблица

Множество таблиц

Отношения

Основано на присоединении

Включает в себя отношения

Перемещение по данным

Перемещение строка за строкой

Переход через отношения

Соединение данных

Подключен или отключен

Отключен

Передача данных

Сортировка COM

Передача XML-файла

С оздание SqlDataReader: Объекты чтения данных получаются из объекта команды с помощью вызова метода ExecuteReader(). После того как вызван метод ExecuteReader объекта Command, вы получаете доступ к записи в DataReader путем вызова метода Read. По умолчанию позиционирование в DataReader устанавливается перед первой записью, поэтому вы должны вызвать Read перед доступом к любым данным. Когда ни одна запись не доступна, метод Read возвращает нулевое значение (false).

Чтение данных из DataReader:

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

string customerID = myReader["CustomerID"].ToString();

string companyName = myReader["CompanyName"].ToString();

Закрытие DataReader. Когда DataReader используется, связи заняты обслуживанием DataReader. Таким образом, нужно всегда вызывать команду Close()(Закрыть), чтобы закрыть DataReader по окончании работы с ним:

if (myReader != null)

myReader.Close();

if (cn.State == ConnectionState.Open)

cn.Close();

Обработка ошибок с помощью DataReader. При использовании соединения с объектом DataReader, всегда нужно использовать блоки try / catch/ finally, чтобы убедиться, что если что-нибудь случится, соединения будут закрыты:

SqlDataReader myReader = null;

try

{

myReader = mycommand.ExecuteReader();

//////// Цикл по результирующему набору: /////

while (myReader.Read())

{

Console.WriteLine("Фамилия {0},Отчество {1}, Имя {2}", myReader["Фамилия"].ToString().Trim(),

myReader["Отчество"].ToString().Trim(), myReader["Имя"].ToString().Trim());

}

}

catch(Exception e)

{

Console.WriteLine(e.ToString());

}

finally

{

if (myReader != null)

myReader.Close();

if (cn.State == ConnectionState.Open)

cn.Close();

Console.WriteLine("Состояние соединения " + cn.State.ToString());

}

Чтение полей из текущей записи. Чтобы получить данные из полей в текущей записи, следует вызвать соответствующий метод Get класса SqlDataReader, например, GetName(i) – имя i-го столбца, GetValue(i) – значение i-го столбца, GetDateTime, GetDouble, GetInt32, или GetString. Параметр метода Get – это порядковый номер поля (столбца записи), которое вы хотите считать. Например, следующий код считывает поля CustomerID и CompanyName, из текущей записи DataReader, с помощью метода GetString:

string customerID = myReader.GetString(0);

string companyName = myReader.GetString(1);

  1. Организация хранения данных. Объект DataSet.

Объект DataSet является представлением реляционных данных, находящимся в памяти. Объект DataSet — это создаваемый в оперативной памяти набор таблиц (объектов DataTablе), связанных между собой отношениями и снабженными средствами проверки целостности данных (для них в DataSet предусмотрены свои объекты).

DataSet – зто класс, содержащий внутри себя три внутренних строго типизированных коллекции:

Через свойство Tables объекта DataSet мы можем получить доступ к отдельным объектам DataTable, которые хранятся в коллекции DataTableCollection. Через другое свойство Relations, мы можем получить доступ к объектам DataRelation, которые хранятся в коллекции DataRelationCollection. Поскольку DataSet — это фактически представление базы данных, которое помещается в оперативную память клиента (и с которой можно работать при разорванном соединении), то в этой модели объекты DataRelation представляют отношения между таблицами базы данных.

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

Свойство ExtendedProperties обеспечивает доступ к объектам, хранящимся в коллекции PropertyCollection. Основное назначение всей этой конструкции со свойством ExtendedProperties и коллекцией PropertyCollection – обеспечить возможность ассоциировать дополнительную информацию (в виде пар имя-значение) с объектом DataSet. В принципе этой дополнительной информацией может быть все, что угодно. Например, мы можем самостоятельно определить, что у нашего объекта DataSet будет свойство Company Name, а в качестве значения этого свойства указать имя нашей компании. Выглядеть это будет так. Создаем объект DataSet и добавляем для него некоторую дополнительную информацию (метаданные):

DataSet ds =new DataSet('MyDataSet");

ds.ExtendedPropertles.Add("CompanyName", "InterTech_Inc"):

// Выводим информацию о только что созданных метаданных:

Console.WriteLine(ds.ExtendedProperties["CompanyName"].ToString());

Мы можем использовать расширенные свойства для хранения самой разной информации — например, о внутреннем пароле для доступа к данным, об интервале синхронизации данных и т. п. Кроме того, расширенные свойства (то есть свойство ExtendedProperties) предусмотрены не только для DataSet, но и для DataTable.

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

Некоторые наиболее важные свойства DataSet представлены в таблице:

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

  1. Таблицы и поля: объекты DataTable и DataColumn.

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

Всякая таблица состоит из столбцов (называемых также полями или клонками) и строк (записей). Для обращения к ним и для управления столбцами и строками в объекте DataTable предназначены специальные объекты – DataColumn и DataRow.

Изучим объект DataColumn. Он представляет отдельный столбец в пределах DataTable. DataColumn – это блок для создания схемы DataTable. Каждый объект DataColumn имеет свойство DataType, которое определяет тип данных, содержащихся в каждом объекте DataColumn. Например, можно ограничить тип данных до целых, строковых и десятичных чисел. Поскольку данные, содержащиеся в DataTable, обычно переносятся обратно в исходный источник данных, необходимо согласовывать тип данных с источником.

Свойства класса DataColumn:

Создание объектов DataColumn:

Console.WriteLine("Создание объектов DataColumn, отображающих реальные столбцы таблицы Туристы");

DataColumn cod = new DataColumn("Код туриста", typeof(int));

cod.Caption = "Код туриста";

cod.ReadOnly = true;

cod.AllowDBNull = false;

cod.Unique = true;

DataColumn fam = new DataColumn("Фамилия", typeof(string));

fam.Caption = "Фамилия";

fam.ReadOnly = false;

fam.AllowDBNull = true;

fam.Unique = false;

DataColumn name = new DataColumn("Имя", typeof(string));

name.Caption = "Имя";

name.ReadOnly = false;

name.AllowDBNull = true;

name.Unique = false;

DataColumn ot = new DataColumn("Отчество", typeof(string));

ot.Caption = "Отчество";

//Свойство Caption используется для отображения названия столбца при выводе данных.

cod.AutoIncrement=true;

cod.AutoIncrementSeed = 0;

cod.AutoIncrementStep = 1;

//При добавлении строк в таблицу значение столбца cod увеличится //на 1.Начальное значение столбца 0.

Тип DataColumn обычно не существует автономно, а добавляется в соответствующий объект DataTable:

Console.WriteLine("Создание объекта DataTable и вставка объектов DataColumn в коллекцию столбцов:");

DataTable Turistes = new DataTable("Туристы");

Turistes.Columns.AddRange(new DataColumn[] { cod, fam, name, ot });