
- •Организация 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. Обновление базы данных с помощью адаптера данных.
Выборка, добавление, удаление и обновление данных с помощью sql-запросов на подсоединенном уровне.
Для модификации таблиц базы данных нужно вызвать метод ExecuteNonQuery() объекта команды, который выполняет вставки, обновления, и удаления в соответствии с форматом соотвествующей команды:
Вставка записи:
// Сбор информации о новом друге:
Console.WriteLine("Введите код друга!");
int kod = Int32.Parse(Console.ReadLine());
Console.WriteLine("Введите фамилию друга!");
string fam = Console.ReadLine();
Console.WriteLine("Введите отчество друга!");
string ot = Console.ReadLine();
Console.WriteLine("Введите имя друга!");
string imja = Console.ReadLine();
// Создание и формирование sql-запроса:
string sql = string.Format("Insert Into Друзья" + "([Код друга], Фамилия, Отчество, Имя) Values" + "('{0}','{1}','{2}','{3}')", kod, fam, ot, imja);
SqlCommand cmd = new SqlCommand(sql, cn);
Console.WriteLine(cmd.CommandText);
try { cmd.ExecuteNonQuery(); }
catch (Exception e) { Console.WriteLine(e.Message); }
Удаление записи: (если соответствующей записи нет в связанной таблице, она не удаляется!)
// Удаление записи с указанным номером друга:
Console.WriteLine("Введите код друга для удаления!");
int kod = Int32.Parse(Console.ReadLine());
string sql = string.Format("Delete from Друзья where [Код друга]={0}", kod);
SqlCommand cmd = new SqlCommand(sql, cn);
Console.WriteLine(cmd.CommandText);
try { cmd.ExecuteNonQuery(); }
catch (Exception e) { Console.WriteLine(e.Message); }
Обновление записи:
// Обновление записи:
Console.WriteLine("Введите код друга для обновления записи!");
int kod = Int32.Parse(Console.ReadLine());
Console.WriteLine("Введите новую фамилию друга!");
string fam = Console.ReadLine();
string sql = string.Format("Update Друзья Set Фамилия='{0}' where [Код друга]={1} ",fam,kod);
SqlCommand cmd = new SqlCommand(sql, cn);
Console.WriteLine(cmd.CommandText);
try { cmd.ExecuteNonQuery(); }
catch (Exception e) { Console.WriteLine(e.Message); }
Отметим, что оба подхода (визуальный и ручной) к созданию и использованию объектов ADO обладают своими областями применения. Для упрощения разработки и сопровождения визуальных форм проще использовать визуальный подход. При создании приложений, от которых требуется надежность, гибкость или отсутствие экранных форм (например, Web-сервис) лучше создавать объекты ADO вручную.
При визуальном подходе наряду с представлением данных в виде таблицы часто приходится использовать традиционные элементы интерфейса, такие как TextBox, Label и пр.
Вывод информации с использованием объекта чтения данных: создание SqlDataReader; чтение данных из DataReader; чтение полей из текущей записи; закрытие DataReader.
Преимуществом использования объекта DataSet является то, что он дает отдаленный обзор базы данных. Для долгого использования приложений, это часто лучший подход. Для Веб-приложений разработчики обычно выполняют короткие и простые операции с каждым запросом, такие как отображение данных. Для таких операций разработчики не должны поддерживать объект DataSet. Или, когда большое количество данных воспроизведено, держать ли память открытой становится вопросом. Например, чтение 10000 строк из базы данных заставляет DataTable выделять и держать память для всех 10000 строк, для жизни таблицы. Если 1000 пользователей сделают это в одно и тоже время, использование памяти станет критическим. В таких случаях лучше использовать объект чтения данных DataReader. Есть два DataReader-объекта: SqlDataReader и OleDbDataReader.
Итак, улучшить производительность приложения можно с помощью DataReader, если нужно получить данные только в прямом направлении, т.е. только для чтения. С помощью DataReader можно получить следующий прирост производительности:
– сохранение памяти, которая будет потребляться DataSet; – экономия времени обработки, которая потребуются для создания и заполнения содержания DataSet;
Для решения таких ситуаций предназначен DataReader. Он служит для выполнения только чтения информации из базы данных в однонаправленный поток. Только одна запись в одну единицу времени существует в памяти. Поэтому объекты чтения данных используются только для SQL-операторов выборки данных. Объекты чтения данных (в отличие от объектов адаптеров данных) поддерживают открытое соединение с источником данных, пока вы явно не закроете соединение.
Существуют важные различия между записями DataReader и DataSet, которые выделены в таблице ниже.