Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
}
Console.WriteLine() ;
}
После компиляции и запуска этого проекта вы должны увидеть список всех автомобилей из таблицы Inventory базы данных Cars (рис. 22.7).

Рис. 22.7. Объекты чтения данных
Получение множества наборов результатов с помощью объектов чтения данных
Объекты чтения данных могут получать от одного объекта команды множество наборов результатов. Например, чтобы получить все строки таблицы Inventory и все строки таблицы Customers, можно указать оба соответствующих SQL-оператора, используя в качестве разделителя точку с запятой.
string theSQL = "Select * From Inventory:Select * "from Customers";
Получив объект чтения данных, можно переходить от одного результирующего набора к другому с помощью метода NextResult(). При этом возвращение к первому набору происходит автоматически. Поэтому, чтобы прочитать строки каждой таблицы, можно построить следующую итерационную конструкцию.
do {
while (myDataReader .Read()) {
// Чтение информации текущего набора результатов.
}
} while (myDataReader .NextResult());
Теперь вы должны знать больше о возможностях объектов чтения данных. Эта объекты предлагают и другие возможности, о которых здесь не упоминалось (например, выполнение скалярных и однострочных запросов). Соответствующие подробности можно найти в документации .NET Framework 2.0 SDK.
Исходный код. Проект CarsDataReader размещен в подкаталоге, соответствующем главе 22.
Изменение содержимого таблиц с помощью объектов команд
Вы только что убедились, что метод ExecuteReader() извлекает объект чтения данных, позволяющий проверить результаты выполнения SQL-оператора Select в однонаправленном и доступном только для чтения потоке. Но если вы хотите применить SQL-команду, в результате которой должна произойти модификация таблицы, вы должны вызвать метод ExecuteNonQuery() соответствующего объекта команды. Этот метод выполняет вставки, обновления и. удаления в соответствии с форматом соответствующей команды.
Чтобы проиллюстрировать возможность модификации существующей базы данных с помощью вызова ExecuteNonQuery(), мы с вами построим новое консольное приложение (CarsInventoryUpdater), предоставляющее пользователю возможность изменения данных таблицы Inventory базы данных Cars. Как и в других примерах, метод Main() здесь отвечает за получение от пользователя инструкций по поводу выполнения конкретных действий, что программно реализуется с помощью оператора switch. Программа разрешает пользователю ввести следующие команды:
• I - вставить новую запись в таблицу Inventory;
• U - обновить существующую запись в таблице Inventory;
• D – удалить существующую запись из таблицы Inventory;
• L – вывести информацию об имеющемся наборе автомобилей, используя объект чтения данных;
• S – показать эти варианты выбора пользователю;
• Q - выйти из программы.
Каждый возможный вариант обрабатывается своим уникальным статическим методом в рамках класса Program. Для полной ясности вот реализация Main(), которая, как кажется, не требует никаких дополнительных комментариев.
static void Main(string[] args) {
Console.WriteLine ("***** Модификатор Inventory для Car ***** ");
bool userDone = false;
string userCommand = "";
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "uid=sa;pwd=;Initial Catalog=Cars;" +
"Data Source=(local);Connect Timeout=30";
cn.Open();
ShowInstructions();
do {
Console.Write("Введите команду: ");
userCommand = Console.ReadLine();
Console.WriteLine();
switch (userCommand.ToUpper()) {
case "I":
InsertNewCar(cn);
break;
case "U":
UpdateCarPetName(cn);
break;
case "D":
DeleteCar(cn);
break;
case "L":
ListInventory(cn);
break;
case "S":
ShowInstructions();
break;
case "Q":
userDone = true;
break;
default:
Console.WriteLine("Некорректные данные! Введите другие");
break;
}
} while (!userDone);
cn.Close();
}
Метод ShowInstructions() делает то, что и следует ожидать.
private static void ShowInstructions() {
Console.WriteLine();
Console.WriteLine("I: добавление новой машины.");
Console.WriteLine("U: модификация имеющейся машины.");
Console.WriteLine("D: удаление имеющейся машины.");
Console.WriteLine("L: список наличных машин.");
Console.WriteLine("S: вывод инструкций . ");
Console.WriteLine(''Q: выход из программы.");
}
Как уже упоминалось, метод ListInventorу() печатает строки таблицы Inventory с помощью объекта чтения данных (соответствующий программный код аналогичен программному коду предыдущего примера CarsDataReader).
private static void ListInventory(SqlConnection cn) {
string strSQL = "Select * From Inventory";
SqlCommand myCommand = new SqlCommand(strSQL, cn);
SqlDataReader myDataReader;
myDataReader = myCommand.ExecuteReader();
while (myDataReader.Read()) {
for (int i = 0; i ‹ myDataReader.FieldCount; i++) {
Console.Write("{0} = {1}"; myDataReader.GetNаmе(i), myDataReader.GetValue(i).ToString().Trim());
}
Console.WriteLine();
}
myDataReader.Close();
}
Итак, текстовый интерфейс пользователя готов, и мы можем теперь перейти к более интересным вещам.
Вставка новых записей
Для вставки новой записи в таблицу Inventory нужно (на основе пользовательского ввода) создать SQL-оператор вставки и вызвать ExecuteNonQuery(). Чтобы не загромождать программный код, здесь из него удалена необходимая программная логика try/catch, которая присутствует в загружаемом варианте программного кода примеров для этой книги.
private static void InsertNewCar(SqlConnection cn) {
// Сбор информации о новой машине.
Console.Write("Введите номер машины: ");
int newCarID = int.Parse(Console.ReadLine());
Console.Write("Введите марку: ");
string newCarMake = Console.ReadLine();
Console.Write("Введите цвет: ");
string newCarColor = Console.ReadLine();
Console.Write("Введите название: ");
string newCarPetName = Console.ReadLine();
// Создание и выполнение оператора SQL.
string sql = string.Format("Insert Into Inventory" +
"(CarID, Make, Color, PetName) Values" +
"({0}', '{1}', '{2}', '{3}')",
newCarID, newCarMake, newCarColor, newCarPetName);
SqlCommand cmd = new SqlCommand(sql, cn);
cmd.ExecuteNonQuery();
}
Замечание.Вы, возможно, знаете, что построение SQL-операторов с помощью конкатенации строк достаточно рискованно с точки зрения безопасности (вспомните о возможных атаках SQL-инъекции). Здесь этот подход используется только для простоты, поскольку, конечно же, предпочтительнее строить текст команд с помощью параметризованных запросов, обсуждение которых предполагается немного позже.
Удаление записей
Удалить существующую запись так же просто, как и вставить новую. Но, в отличие от программного кода для InsertNewCar(), ниже демонстрируется важная возможность применения try/catch для обработки попытки удаления автомобиля, используемого в настоящий момент в процессе оформления заказа для покупателя из таблицы Customers (сама эта таблица будет рассмотрена в этой главе позже).
Читать дальшеИнтервал:
Закладка: