
- •Организация c#-системы ввода-вывода: байтовые и символьные потоки. Встроенные потоки.
- •Классы потоков. Класс Stream. Классы байтовых потоков. Классы символьных потоков. Классы двоичных потоков.
- •Класс FileStream и файловый ввод-вывод на побайтовой основе. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream.
- •Файловый ввод-вывод с ориентацией на символы. Использование класса StreamWriter. Использование класса StreamReader.
- •Считывание и запись двоичных данных. Класс BinaryWriter. Класс BinaryReader.
- •6. Навигация по файловой системе: классы для работы с файловой системой.
- •7. Получение сведений о файле; копирование файлов; перечисление файлов в папке; изменение расширения файлов.
- •5.3. Изменение расширения файлов
- •8. Основы организации потоков. Потоки и многозадачность. Пространство имен System.Threading. Класс Thread. Создание потока.
- •9. Использование нескольких потоков. Планирование потоков, приоритеты потоков.
- •10. Проблемы одновременности и синхронизации потоков. Общий доступ к данным из разных потоков, предотвращение коллизий.
- •11. Синхронизация доступа к общим данным с помощью блокировок. Управление временем существования потоков.
- •12. Краткий обзор ado.Net. Три стороны технологии ado.Net. Пространство имен System.Data.
- •13. Поставщики данных ado.Net. Поведение объектов подключения.
- •14. Объектная модель ado.Net
- •16. Создание соединения с источником данных. Члены типа dbConnection. Обработка исключений при работе с ms sql
- •Конструкторы
- •Свойства
- •События
- •17. Работа с бд с пом. Sql-запросов. Класс SqlCommand. Объект Command. Создание и инициализация. Командная строка sql-запроса CommandText.
- •Конструкторы
- •Свойства
- •18. Выборка, добавление, удаление и обновление данных с помощью sql-запросов на подсоединенном уровне.
- •19. Вывод информации с использованием объекта чтения данных: создание SqlDataReader; чтение данных из DataReader; чтение полей из текущей записи; закрытие DataReader.
- •20. Организация хранения данных. Объект DataSet
- •21. Таблицы и поля: объекты DataTable и DataColumn
- •22. Строки: объект DataRow
- •23. Связи между таблицами: объект DataRelation
- •24. Создание подключения к базе данных. Управляемые провайдеры
- •25. Объект DataAdapter. Класс SqlDataAdapter
- •Конструкторы:
- •Свойства
- •Организация c#-системы ввода-вывода: байтовые и символьные потоки. Встроенные потоки.
22. Строки: объект DataRow
Содержимое таблицы (непосредственно данные) задается набором DataRows – это конкр-е мн-во строк таблицы, каждая из к-ых явл объектом-представителем класса DataRow. Его методы и свойства представлены в таблице.
Свойства |
|
||
HasErrors |
Возвращает значение, показывающее, есть ли ошибки в строке |
|
|
Item |
Перегружен. Возвращает или задает данные, сохраненные в указанном столбце. В языке C# это свойство является индексатором класса DataRow |
|
|
ItemArray |
Возвращает или задает все значения для этой строки с помощью массива |
|
|
RowError |
Возвращает или задает пользовательское описание ошибки для строки |
|
|
RowState |
Возвращает текущее состояние строки по отношению к DataRowCollection |
|
|
Table |
Возвращает объект DataTable, содержащий данную строку |
|
|
Методы |
|||
AcceptChanges |
Сохраняет все изменения, сделанные с этой строкой со времени последнего вызова AcceptChanges |
||
BeginEdit |
Начинает операцию редактирования объекта DataRow |
||
CancelEdit |
Отменяет текущее редактирование строки |
||
ClearErrors |
Удаляет ошибки в строке, включая RowError и ошибки, установленные SetColumnError |
||
Delete |
Удаляет DataRow |
||
EndEdit |
Прекращает редактирование строки |
||
Equals(унаследовано отObject) |
Перегружен. Определяет, равны ли два экземпляра Object |
||
GetChildRows |
Перегружен. Возвращает дочерние строки DataRow |
||
GetColumnError |
Перегружен. Возвращает описание ошибки для столбца |
||
GetColumnsInError |
Возвращает массив столбцов, имеющих ошибки |
||
GetHashCode(унаследовано от Object) |
Служит хэш-функцией для конкретного типа, пригоден для использования в алгоритмах хэширования и в структурах данных, например в хэш-таблице |
||
GetParentRow |
Перегружен. Возвращает родительскую строку DataRow |
||
GetParentRows |
Перегружен. Возвращает родительские строки DataRow |
||
GetType(унаследовано от Object) |
Возвращает Type текущего экземпляра |
||
HasVersion |
Возвращает значение, показывающее, существует ли указанная версия |
||
IsNull |
Перегружен. Возвращает значение, показывающее, содержит ли нулевое значение указанный столбец |
||
RejectChanges |
Отменяет все значения, выполненные со строкой после последнего вызова AcceptChanges |
||
SetColumnError |
Перегружен. Устанавливает описание ошибки для столбца |
||
SetParentRow |
Перегружен. Устанавливает родительскую строку DataRow |
||
ToString(унаследовано от Object) |
Возвращает объект типа String, который представляет текущий Object |
Защищенные методы |
|
Finalize(унаследовано от Object) |
Переопределен. Позволяет объекту Object попытаться освободить ресурсы и выполнить другие завершающие операции перед тем как объект Object будет уничтожен в процессе сборки мусора. В языках C# и C++ для функций финализации используется синтаксис деструктора |
MemberwiseClone(унаследовано от Object) |
Создает неполную копию текущего объекта Object |
SetNull |
Устанавливает значение указанного DataColumn на нулевое |
Элементы набора DataRows являются объектами класса DataRow. В этом классе обеспечивается несколько вариантов реализации свойства Item, которые обеспечивают навигацию по множеству записей объекта DataTable и сохранение текущих изменений данных, сделанных за текущий сеанс редактирования базы. Посредством набора Rows реализуется возможность ссылки на любую запись таблицы. К любой записи можно обратиться напрямую, и поэтому не нужны методы позиционирования и перемещения по записям таблицы. По множеству строк позиционирование проводится по целочисленному значению индекса. Выбор записи в строке производится по строковому значению, которое соответствует имени столбца.
Работа с типом DataRow отличается от работы с DataColumn, так как у него нет общедоступного конструктора:
DataRow r=new DataRow(); // Ошибка!
Однако новый DataRow можно получить из конкретного DataTable. Допустим, нужно вставить две строки в таблицу Turistes. Метод DataTable.NewRow() добавляет строку в таблицу, а затем нужно с помощью индексатора типа добавить в каждый столбец данные:
Console.WriteLine("Добавление строк в таблицу Turistes:");
DataRow r = Turistes.NewRow();
Console.WriteLine("Состояние строки " + r.RowState);
r["Код туриста"] = 0;
r["Фамилия"] = "Nareyko";
r["Имя"] = "Nina";
r["Отчество"] = "Nikolaewna";
Turistes.Rows.Add(r);
r = Turistes.NewRow();
r["Код туриста"] = 1;
r["Фамилия"] = "Zenko";
r["Имя"] = "Sergej";
r["Отчество"] = "Iwanowich";
Turistes.Rows.Add(r);
Индексатор класса DataRow позволяет получить доступ к объекту DataColumn как по числовому индексу столбца, так и по его имени.
Свойство RowState
Свойство RowState применяется для программной идентификации множества всех строк таблицы, которые изменили свое первоначальное значение, были вставлены и т.п. Это свойство может принимать любое значение из перечисления DataRowState Возможные значения приведены ниже:
Added – Строка была добавлена в DataRowCollection, а AcceptChanges() еще
не был вызван.
Deleted – Строка была помечена для удаления с помощью метода Delete() класса DataRow, a AcceptChanges() еще не был вызван.
Detached – Строка была создана, но не включена ни в какой DataRowCollection. Объект DataRow находится в этом состоянии после его создания, но до занесения в какую-либо коллекцию, либо после исключения из коллекции
Modified – Строка была изменена, a AcceptChanges() еще не был вызван.
Unchanged – строка не была изменена после последнего вызова AcceptChanges()
Console.WriteLine("Состояние строки " + r.RowState);
Объект DataRow вполне разумно отслеживает свое состояние, поэтому объект DataTable может определить добавленные, измененные и удаленные строки. Это очень важная возможность DataSet, потому что когда наступит время послать информацию в хранилище данных, будут отправлены только измененные данные.
Работа с DataTable. Тип DataTable определяет большое количество членов, многие из которых по именам и возможностям идентичны членам DataSet.
Основные члены типа DataTable
CaseSensitive – Указывает, чувствительны ли к регистру символов строковые сравнения в таблице. По умолчанию равно false
ChildRelations – Возвращает коллекцию дочерних отношений для данного DataTable (если они есть).
Constraints – Получ коллекцию ограничений, поддерживаемых данной таблицей
Сору() – Метод, копирующий схему и дату DataTable в новый экземпляр
DataSet – Получает DataSet, содержащий данную таблицу (если он есть)
DefaultView – Получает специализированное представление таблицы, к-ое может
содержать отфильтрованное представление или позицию курсора.
ParentRelations – Получ коллекцию родит-ких отношений для данного DataTable
PrimaгуКеу – Получ или задает массив столбцов, которые выступают в качестве первичных ключей для таблицы данных.
RemotingFormat – Позволяет определить формат сериализации объектом DataSet его содержимого (двоичный или XML) для уровня NET Remoting
TableName – Получ или задает имя таблицы. Значение этого свойства можно так же задать через параметр конструктора
Установим свойство PrimareKey (первичный ключ для таблицы) столбцу cod:
Console.WriteLine("Установка первичного ключа для таблицы:");
Turistes.PrimaryKey = new DataColumn[] { Turistes.Columns[0] };
Наш объект DataTable Turistes создан. Осталось вставить его в объект DataSet с помощью коллекции Tables: MyDS.Tables.Add(Turistes);
Выведем содержимое объекта DataSet на экран:
Console.WriteLine("Данные DataSet:");
Console.WriteLine("Таблицы в DataSet:" + MyDS.DataSetName);
//Вывод имени DataSet и расширенных свойств:
foreach (System.Collections.DictionaryEntry de in MyDS.ExtendedProperties)
Console.WriteLine("Ключ " + de.Key + " , значение " + de.Value);
Console.WriteLine();
//Вывод каждой таблицы:ъ
foreach (DataTable dt in MyDS.Tables)
{
Console.WriteLine("Таблица :" + dt.TableName);
//Вывод имен столбцов:
for (int curCol = 0; curCol < dt.Columns.Count; curCol++) Console.Write(dt.Columns[curCol].ColumnName.Trim() + "\t");
Console.WriteLine("\n----------------------------------------");
//Вывод содержимого DataTable:
for (int curRow = 0; curRow < dt.Rows.Count; curRow++)
{
for (int curCol = 0; curCol < dt.Columns.Count; curCol++) Console.Write(dt.Rows[curRow][curCol].ToString() + "\t");
Console.WriteLine();
}
}
Тип DataTable поддерживает также метод CreateDataReader(). Этот метод позволяет получить данные DataTable, используя схему, соответствующую схеме навигации объекта чтения Datareader (только вперед и только для чтения):
DataTableReader dtReader=Turisres.CreateDataReader();
while (dtReader.Read())
{
for (int i=0; i<rdReader.FieldCount; i++)
Console.WriteLine(“dtReader.GetName(i) +” “+ dtReader.GetValue(i).ToString());
Console.WriteLine();
}
dtReader.Close();
DataTableReader работает аналогично объекту чтения поставщика данных. Его можно использовать, когда нужно прочесть данные DataTable без просмотра внутренних коллекций строк и столбцов.