- •Организация c#-системы ввода-вывода: байтовые и символьные потоки. Встроенные потоки.
- •Классы потоков. Класс Stream. Классы байтовых потоков. Классы символьных потоков. Классы двоичных потоков.
- •1.5. Классы символьных потоков:
- •1.6. Классы двоичных потоков:
- •Класс FileStream и файловый ввод-вывод на побайтовой основе. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream.
- •Файловый ввод-вывод с ориентацией на символы. Использование класса StreamWriter. Использование класса StreamReader.
- •Считывание и запись двоичных данных. Класс BinaryWriter. Класс BinaryReader.
- •Наиболее важные методы выходного потока BinaryWriter:
- •Навигация по файловой системе: классы для работы с файловой системой.
- •Получение сведений о файле; копирование файлов; перечисление файлов в папке; изменение расширения файлов.
- •5.3. Изменение расширения файлов
- •Основы организации потоков. Потоки и многозадачность.
- •Пространство имен System.Threading. Класс Thread. Создание потока.
- •Создание потока. Чтобы создать поток, необходимо создать объект типа Thread. В классе Thread определен следующий конструктор: public Thread(ThreadStart entryPoint),
- •Приоритет потоков. Класс Thead поддерживает установку и получение приоритета потока. Для этого используется перечисление ThreadPriority. Его значения:
- •Использование нескольких потоков. Планирование потоков, приоритеты потоков. Можно создавать в программе несколько дочерних потоков.
- •Создать статический метод SimpleWork() в классе MultiThread (перед методом Main), который выводит на экран Id-номер каждого потока:
- •Проблемы одновременности и синхронизации потоков. Общий доступ к данным из разных потоков, предотвращение коллизий.
- •Синхронизация доступа к общим данным с помощью блокировок.
- •2) Выполнить блокировку операторов в ранее используемых методах SimpleWork и run:
- •Управление временем существования потоков.
- •Краткий обзор ado.Net. Три стороны технологии ado.Net. Пространство имен System.Data.
- •2.2 Три стороны технологии ado.Net
- •15.Поставщики данных ado.Net. Поведение объектов подключения.
- •Объектная модель ado.Net.
- •Создание соединения с источником данных. Члены типа dbConnection. Обработка исключений при работе с ms sql
- •Конструкторы
- •Свойства
- •События
- •Конструкторы
- •Свойства
- •Выборка, добавление, удаление и обновление данных с помощью sql-запросов на подсоединенном уровне.
- •Вывод информации с использованием объекта чтения данных: создание SqlDataReader; чтение данных из DataReader; чтение полей из текущей записи; закрытие DataReader.
- •Сравнение DataReader и DataSet:
- •Чтение данных из DataReader:
- •Организация хранения данных. Объект DataSet.
- •Строки: объект DataRow.
- •Конструкторы:
- •Свойства
- •Передача данных между источником данных и объектом DataSet. Обновление базы данных с помощью адаптера данных.
Сравнение 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);
Организация хранения данных. Объект 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 представлены в таблице:
Таблицы и поля: объекты 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 });
