Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 953
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Рис. 10.17. Фрагмент работы программы обновления данных
Представляет интерес программирование модификации записей базы данных. Эта возможность запрограммирована при обработке события "щелчок мышью на кнопке" Сохранить в БД. Здесь свойству CommandText присвоено значение текста SQL-запроса. В качестве заменителей параметров используются вопросительные знаки. Как видно, в данном SQL-запросе имеют место три вопросительных знака. Им соответствуют три параметра, которые должны указываться именно в порядке следования вопросительных знаков. Эти параметры задаем с использованием метода COMMAND.Parameters. Add. Здесь указываем имя поля (например, "Номер телефона", тип, длину параметра и значение по умолчанию. Заметим, что третий параметр ("Номер п/п") задается как новый, поскольку он не должен подлежать редактированию со стороны пользователя, а устанавливаться автоматически, независимо от пользователя.
Далее в блоке try. . .catch вызываем непосредственно метод Update, который возвращает количество (kol) обновленных записей. В случае неудачного обновления обрабатывается исключительная ситуация Exception, объект Exception обеспечивает соответствующее сообщение о недоразумении.
Убедиться в работоспособности программы можно, открыв решение БдUpdate.sln в папке БдUpdate.
Пример 74. Удаление записей из таблицы базы данных с использованием SQL-запроса и объекта класса Command
Можно также удалять записи (строки из таблицы БД), формируя в программ соде соответствующий SQL-запрос, передаваемый в объект класса Сommand, но объект Сommand — обеспечивает привязку SQL-выражения к соединению с базой данных. Напишем самый простой пример такой программы, для этого запустим Visual Studio 2010 и закажем новый проект New Project. В данном случае экранная форма нам не нужна, поэтому выберем, как и в некоторых предыдущих примерах, шаблон Console Application С#. Для того чтобы во время выполнения данной программы не видеть черного DOS-экрана, в меню Project выберем команду ConsoleApplication1 Properties и на вкладке Application укажем в раскрывающемся списке Application type тип приложения Windows s Application. Чтобы иметь доступ к функции MessageBox.Show, добавим к проекту ссылку на динамическую библиотеку Forms.dll. Для этого выберем пункты
Project | Add Reference и на вкладке .NET дважды щелкнем по ссылке на библиотеку System.Windows.Forms.dll. Отметим, что при этом в окне Sulution Explorer среди ссылок References появится соответствующая этой библиотеке ссылка.
Далее напишем программный код из листинга 10.8.
Листинг10.8. Удаление записей из таблицы БД
//Программа удаляет запись из таблицы БД с использованием SQL-запроса и обьекта класса Command
System.Windows.Forms; // - добавили эту директиву для MessageBox
//Добавляем эту директиву для краткости выражений:
Using ОлеДиБи = System.Data.OleDb;
// Другиедирективы using удалены, поскольку они не используются в данной программе
namespасе БдУдаленЗаписи
{
class Program
{
static void Main(string[] args)
{ // Создаем объект Connection и передаем ему строку подключения
var Подключение = new ОлеДиБи.
OleDbConnection( // Строка подключения:
"Data Source=\"C:\\vic.mdb\";User " +
"ID=Admin;Provider=\"Microsoft.Jet.OLEDB.4.0\";");
Подключение.Open();
// Создаем объект класса Command, передавая ему SQL-команду
var Команда = new ОлеДиБи.OleDbCommand(
"Delete * From [БД телефонов] Where " + "ФИО Like 'Vi%'", Подключение);
// Выполнение команды SQL
int i = Команда. ExecuteNonQuery ();
// i - количество удаленных записей
if (i > 0) MessageBox.Show(
"Записи, содержащие в поле ФИО фрагмент 'Vi*', удалены");
if (i == 0) MessageBox.Show(
"Запись, содержащая в поле ФИО фрагмент 'Vi*', не найдена");
Подключение.Close();
}
}
)
Здесь при создании объекта класса Command задан SQL-запрос на удаление (Delete) всех записей, содержащий в поле ФИО фрагмент текста "Vi*", причем строчные и прописные буквы являются равнозначными, т. е. будут удалены записи, содержащие "Vi*", "vi*", "VI*" и прочие комбинации. Таким образом, поиск записей ведется без учета регистра (case-insensitive search).
Замечу, что здесь для выполнения команды SQL использован метод ExecuteNonQuery. Он возвращает в переменную i количество удаленных записей. Если i = 0, значит, записи с таким контекстом не найдены и ни одна запись не удалена.
Убедиться в работоспособности программы можно, открыв решение БдУдаленЗаписи.sln в папке БдУдаленЗаписи.
3>
ГЛАВА 11. Использование технологии LINQ.
Технология LINQ (Language Integrated Query) предназначена для обработки (запросов и преобразований) практически любого типа источника данных, начиная от массивов, файлов, строк, коллекций объектов .NET Framework, баз данных SQL Server, наборов данных ADO.NET (DataSet) и XML-документов. LINQ упрощает ситуацию, предлагая единообразные стандартные шаблоны для работы с данными в различных видах источников и форматов данных. Стандартные шаблоны включают в себя основные операции запросов LINQ: фильтрация, упорядочение, группировка, соединение, выбор (проецирование), статистическая обработка. По форме синтаксис языка LINQ очень похож на язык запросов SQL. В данной главе рассмотрим типичные LINQ-запросы и преобразования к некоторым источникам данных.
Пример 75. LINQ-запрос к массиву данных
LINQ-запрос представляет собой выражение, извлекающее данные из источника данных. Все операции запроса LINQ состоят из трех различных действий: получение источника (в нашем случае — это присвоение начальных значений исходному массиву) данных, создание запроса (начинается с предложения from) и непосредственное выполнение запроса (обычно это цикл foreach). В данном разделе рассмотрим две задачи, первая — из массива имен извлекаем имена длиной шесть символов, записывая их или в список (коллекцию), или в новый массив. Другая задача — из массива целых чисел выбираем только те, значения которых больше четырех, также записывая результат запроса в список или массив.
Итак, запустим Visual Studio 2010, закажем новый проект шаблона Windows forms Application С#. Затем из панели элементов перенесем в форму текстовое поле. Далее через щелчок правой кнопкой мыши перейдем к вкладке программного кода (листинг 11.1).
Листинг 11.1. Извлечение данных из массивов
// Решаем две задачи по выбору элементов из массива с помощью стандартных запросов технологии LINQ
using System;
using System.Linq;
using System.Windows.Forms;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace Linq1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Text = "Технология LINQ"; textBox1.Multiline = true;
// ЗАДАЧА 1.
//Из массива имен выбрать имена с количеством букв, равным шести,
// вывести эти имена в текстовое поле TextBox в алфавитном порядке,
// при этом все буквы перевести в верхний регистр.
// Решение:
string СтрокаИмен = "Витя Лариса Лариса Лена Андрей Женя " +
"Александр Лариса Виктор Света Оксана Наташа";
//Из строки имен получаем массив имен, задавая в качестве
// разделителя подстрок символ пробела:
string[] Имена = СтрокаИмен.Split(' ');
// или проще: string[] Имена =
// { "Витя", "Лариса", "Лариса", "Лена", "Андрей", "Женя",
// "Александр", "Лариса", "Виктор", "Света", "Оксана", "Наташа" }
textBox1.Text = "ЗАДАЧА 1, В списке имен:\r\n\r\n";
foreach (string х in Имена)
textBoxl.Text = textBox1.Text + x + " ";
// В результате LINQ-запроса получаем список имен с количеством букв,
// равным шести:
var Запрос = from s in Имена
where s.Length ==6 // - условие выбора
orderby s // - сортировать в алфавитном порядку
select s.ToUpper(); // - перевод в верхний регистр
// s - переменная диапазона, схожа с переменной итерации в foreach
// Удаляем элементы-дубликаты из списка имен:
Запрос = Запрос.Distinct();
// Или таким образом:
// Запрос = Запрос.Union(Запрос);
textBox1.Text = textBox1.Text + "\r\n\r\n" + "выбираем имена с количеством букв равным шести, при " + "этом избавляемся от дублирования имен:\r\n\r\n";
foreach (string x in Запрос) // x - переменная итерации в цикле foreach
textBoxl.Text = textBox1.Text + x + " ";
textBoxl.Text = textBox1.Text + "\r\n\r\n";
//
// ЗАДАЧА 2. Из массива целых чисел X[] требуется выбрать числа,
// значения которых >= 4, и записать эти числа в список Y,
// отсортировав выбранные числа по возрастанию.
// Решение.
// Инициализация массива целых чисел:
int[] X = { -2, 5, -23, 0, 7, -10, 11, 11, 14, 3, 8, 5, -5, 27, 8 };
textBox1.Text += "ЗАДАЧА 2. Из заданного массива X:\r\n\r\n";
foreach (int х in X)
textBox1.Text = textBoxl.Text + x + " ";
textBox1.Text = textBox1.Text + "\г\п\г\пвыбираем числа, значения " +
"которых >= 4 и записываем их в список (коллекцию) Y, " +
"исключая элементы-дубликаты:\r\n\r\n";
// Y - это список, в который помещаются выбранные элйменты:
var Y = from х in X
where х >= 4 // - условие выбора
orderby х // - сортируем по возрастанию
select х;
// Таким образом можно получить результат запроса в массив:
// int[] Y = (from х in X // Здесь Y - это уже массив;
// where х >= 4 /./ - условие выбора;
// orderby х // - сортируем по возрастанию;
// select х).ToArray(); // - преобразование списка в массив
// Удаляем элементы-дубликаты из списка целых чисел:
var Z = Y.Distinct();
// Или таким образом: // var Z = Y.Union(Y);
// Вывод элементов списка Y в метку textBox1:
foreach (var z in Z)
textBox1.Text = textBox1.Text + z.ToString() + " ";
}
}
}
Как видно из программного кода, после присвоения массиву Имена начальных значений создаем запрос, который предусматривает выбор (select) из (from) массива Имена строк длиной (Length) ровно шесть символов (условие where). Запись выбранных имен выполняется в список Запрос с сортировкой списка в алфавитном порядке имен. Далее для удаления повторяющихся имен в списке использу, функцию Distinct. В комментарии показано, как можно для этой же цели используем функцию Union, которая, вообще говоря, находит объединение двух множеств, т. е. выбирает в двух списках одинаковые элементы с удалением повторяющихся элементов. Поскольку мы объединяем два одинаковых списка, то получаем просто удаление повторяющихся элементов. Цикл foreach выводит список Запрос в текстовое поле textBox1.
Следующая задача, решенная в данном программном коде, аналогична. Задан массив целых чисел х. Из этого массива выбираем в список Y элементы массщ значения которых больше или равны четырем. В комментарии показано, как можно записать результаты LINQ-запроса в массив. Удаление повторяющихся элементов в списке выполнено также с использованием функции Distinct.
На рис. 11.1 приведен фрагмент работы программы.
Рис. 11.1 LINQ-запросы к массивам данных
Убедиться в работоспособности программы можно, открыв решение Linq1.sln папки Linq1.
Пример 76. LINQ-запрос к коллекции (списку) данных
В некоторых случаях хранение данных в коллекции (скажем, в списке типаList) может оказаться более эффективным, чем в массиве. Например, если число элементов в массиве при работе изменяется часто или нельзя предсказать максимальное количество необходимых элементов, то можно получить большую производительность при использовании коллекции. Но если размер не изменяется или изменяется довольно редко, то массив, пожалуй, более эффективен. Как всегда, производительность в большей степени зависит от конкретного приложения. Как советуют в документации MSDN, часто стоит потратить время на испытание и массива и коллекции, чтобы выбрать наиболее практичный и эффективный вариант. Решим три типичных задачи, их условия сформулируем при объяснении работы программы. Запустим