- •Андрей Большаков
- •Пошаговое руководство. Обработка данных (c#) (linq to sql)
- •Создание решения linq to sql
- •Добавление сборки System.Data.Linq
- •Добавление файла кода northwind в проект
- •Настройка и проверка подключения к базе данных
- •Добавление нового объекта сущностей Customer
- •Изменение имени клиента
- •Удаление строки
- •Отправка изменений в базу данных
Удаление строки
-
Добавьте следующий код перед
Console.ReadLine();
.
// Access the first element in the Orders collection.
Order ord0 = existingCust.Orders[0];
// Access the first element in the OrderDetails collection.
OrderDetail detail0 = ord0.OrderDetails[0];
// Display the order to be deleted.
Console.WriteLine
("The Order Detail to be deleted is: OrderID = {0}, ProductID = {1}",
detail0.OrderID, detail0.ProductID);
// Mark the Order Detail row for deletion from the database.
db.OrderDetails.DeleteOnSubmit(detail0);
Отправка изменений в базу данных
Последнее действие, необходимое для создания, обновления и удаления объектов, заключается в фактической отправке изменений в базу данных. Без него изменения останутся на локальном уровне и не появятся в результатах запроса.
Отправка изменений в базу данных
-
Вставьте следующий код перед
Console.ReadLine
.
db.SubmitChanges();
-
Вставьте следующий код (после
SubmitChanges
), чтобы показать результаты до и после отправки изменений.
Console.WriteLine("\nCustomers matching CA after update");
foreach (var c in db.Customers.Where(cust =>
cust.CustomerID.Contains("CA")))
{
Console.WriteLine("{0}, {1}, {2}",
c.CustomerID, c.CompanyName, c.Orders.Count);
}
-
Нажмите клавишу F5 для отладки решения.
использование классов в качестве структур данных при работе на LINQ
особенности технологии WPF
Windows Presentation Foundation (WPF, кодовое название — Avalon) — система для построения клиентских приложений Windows с визуально привлекательными возможностями взаимодействия с пользователем, графическая (презентационная) подсистема в составе .NET Framework (начиная с версии 3.0), имеющая прямое отношение к XAML.
Особенности техноогии
В основе WPF лежит векторная система визуализации, не зависящая от разрешения и созданная с расчетом на возможности современного графического оборудования. WPF предоставляет средства для создания визуального интерфейса, включая Язык XAML (Extensible Application Markup Language), элементы управления, привязку данных, макеты, двухмерную и трехмерную графику, анимацию, стили, шаблоны, документы, текст, мультимедиа и оформление [1].
Графической технологией, лежащей в основе WPF является DirectX, в отличие от Windows Forms, где используется GDI/GDI+[2]. Производительность WPF выше, чем у GDI+за счёт использования аппаратного ускорения графики через DirectX.
Также существует урезанная версия CLR, называющаяся WPF/E, она же известна как Silverlight.
Использование разметки XAML
XAML представляет собой XML, в котором фактически реализованы классы .NET Framework. Так же реализована модель разделения кода и дизайна, позволяющая кооперироваться программисту и дизайнеру. Кроме того, есть встроенная поддержка стилей элементов, а сами элементы легко разделить на элементы управления второго уровня, которые в свою очередь разлагаются до уровня векторных фигур и свойств/действий. Это позволяет легко задать стиль для любого элемента, например, того же Button(кнопка).
просмотр и редактирование данных из баз данных средствами Visual Studio 2008
BindingNavigator - класс
Представляет пользовательский интерфейс для перехода и обработки для элементов управления на форме, которые привязываются к данным.
Пространство имен: System.Windows.Forms
Сборка: System.Windows.Forms (в System.Windows.Forms.dll)
Синтаксис
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)]
public class BindingNavigator : ToolStrip,
ISupportInitialize
Элемент управления BindingNavigator представляет стандартный способ навигации и управления данными на форме.В большинстве случаев элемент управления BindingNavigator соединяется попарно с элементом управления BindingSource, чтобы обеспечивать перемещение между записями данных на форме и взаимодействовать с ними.В этих случаях свойство BindingSource устанавливается на соответствующий компонент System.Windows.Forms.BindingSource, который действует в качестве источника данных.
По умолчанию, пользовательский интерфейс элемента управления BindingNavigator включает в свой состав ряд кнопок ToolStrip, текстовых окон, а также статические текстовые элементы для наиболее общих действий, связанных с данными, таких как добавление данных, удаление данных и переход между данными.Каждый из этих элементов управления может извлекаться или устанавливаться посредством соответствующего члена элемента управления BindingNavigator.Кроме того, имеется также взаимнооднозначное соответствие членам в классе BindingSource, которые программно выполняют аналогичные функции, как это показано в следующей таблице.
Добавление элемента управления BindingNavigator на форму и его привязка к источнику данных, такому как BindingSource, будет автоматически устанавливать взаимосвязи в этой таблице.
Для настройки панели инструментов можно использовать один из следующих методов:
-
Создайте объект BindingNavigator с конструктором BindingNavigator(Boolean), который принимает логический параметр addStandardItems и устанавливает для него значение false.Затем добавьте необходимые объекты ToolStripItem в коллекцию Items.
Если требуется существенная настройка или пользовательский проект будет использоваться повторно, создайте класс из BindingNavigator и переопределите метод AddStandardItems, чтобы определить дополнительные или альтернативные стандартные элементы.
применение языка LINQ для баз данных
LINQ to DataSet упрощает и ускоряет запросы к данным, кэшированным в объекте DataSet. В особенности LINQ to DataSet упрощает создание запросов, позволяя писать их непосредственно на языке программирования, а не применять отдельный язык запросов. Это особенно полезно для разработчиков среды Visual Studio, которые теперь могут воспользоваться в своих запросах преимуществами проверки синтаксиса во время компиляции, статической типизации и поддержки технологии IntelliSense, обеспечиваемой средой Visual Studio.
Технология LINQ to DataSet также может использоваться для запросов к данным, находящимся в одном или нескольких источниках. Это удовлетворяет многим сценариям, требующим гибкости при представлении и обработке данных, таких как запросы к данным, прошедшим локальную статистическую обработку, и кэширование на среднем уровне в веб-приложениях. В частности, этот метод обработки требуется для универсальных приложений отчетности, анализа и бизнес-аналитики.
Соединение — важная операция в запросах, которые обращаются к источникам данных без доступных для навигации взаимосвязей, например к таблицам реляционной базы данных. Соединение двух источников данных представляет собой взаимосвязь объектов одного источника данных с объектами, использующими общий атрибут в другом источнике данных. Дополнительные сведения см. в разделе Общие сведения о стандартных операторах запроса.
Примеры в данном разделе демонстрируют, как использовать методы GroupJoin и Join для запроса к DataSet с использованием синтаксиса выражений запросов.
Метод FillDataSet, используемый в данных примерах, описан в разделе Загрузка данных в DataSet.
В примерах данного раздела используются таблицы Contact, Address, Product, SalesOrderHeader и SalesOrderDetail из образца базы данных AdventureWorks.
В примерах, приведенных в этом разделе, используются следующие инструкции using/Imports:
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Data.Common;
using System.Globalization;
Дополнительные сведения см. в разделе Как создать проект LINQ to DataSet в среде Visual Studio.
GroupJoin
Пример
В этом примере выполняется операция GroupJoin с таблицами SalesOrderHeader и SalesOrderDetail, чтобы найти количество заказов для каждого клиента. Групповое соединение эквивалентно левому внешнему соединению, которое возвращает каждый элемент первого (левого) источника данных, даже если в другом источнике данных не имеется соответствующих элементов.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
var orders = ds.Tables["SalesOrderHeader"].AsEnumerable();
var details = ds.Tables["SalesOrderDetail"].AsEnumerable();
var query =
from order in orders
join detail in details
on order.Field<int>("SalesOrderID")
equals detail.Field<int>("SalesOrderID") into ords
select new
{
CustomerID =
order.Field<int>("SalesOrderID"),
ords = ords.Count()
};
foreach (var order in query)
{
Console.WriteLine("CustomerID: {0} Orders Count: {1}",
order.CustomerID,
order.ords);
}
Пример
В этом примере выполняется операция GroupJoin с таблицами Contact и SalesOrderHeader. Групповое соединение эквивалентно левому внешнему соединению, которое возвращает каждый элемент первого (левого) источника данных, даже если в другом источнике данных не имеется соответствующих элементов.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable contacts = ds.Tables["Contact"];
DataTable orders = ds.Tables["SalesOrderHeader"];
var query =
from contact in contacts.AsEnumerable()
join order in orders.AsEnumerable()
on contact.Field<Int32>("ContactID") equals
order.Field<Int32>("ContactID")
select new
{
ContactID = contact.Field<Int32>("ContactID"),
SalesOrderID = order.Field<Int32>("SalesOrderID"),
FirstName = contact.Field<string>("FirstName"),
Lastname = contact.Field<string>("Lastname"),
TotalDue = order.Field<decimal>("TotalDue")
};
foreach (var contact_order in query)
{
Console.WriteLine("ContactID: {0} "
+ "SalesOrderID: {1} "
+ "FirstName: {2} "
+ "Lastname: {3} "
+ "TotalDue: {4}",
contact_order.ContactID,
contact_order.SalesOrderID,
contact_order.FirstName,
contact_order.Lastname,
contact_order.TotalDue);
}
Join
Пример
В этом примере выполняется соединение таблиц SalesOrderHeader и SalesOrderDetail, чтобы получить заказы, действующие с августа.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable orders = ds.Tables["SalesOrderHeader"];
DataTable details = ds.Tables["SalesOrderDetail"];
var query =
from order in orders.AsEnumerable()
join detail in details.AsEnumerable()
on order.Field<int>("SalesOrderID") equals
detail.Field<int>("SalesOrderID")
where order.Field<bool>("OnlineOrderFlag") == true
&& order.Field<DateTime>("OrderDate").Month == 8
select new
{
SalesOrderID =
order.Field<int>("SalesOrderID"),
SalesOrderDetailID =
detail.Field<int>("SalesOrderDetailID"),
OrderDate =
order.Field<DateTime>("OrderDate"),
ProductID =
detail.Field<int>("ProductID")
};
foreach (var order in query)
{
Console.WriteLine("{0}\t{1}\t{2:d}\t{3}",
order.SalesOrderID,
order.SalesOrderDetailID,
order.OrderDate,
order.ProductID);
}