Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 1357
Скачиваний: 3
Применение класса DataSet
using System; using System.Data;
namespace mergeTest
{
class Class1
{
static void Main(string[] args)
{
// Создаётся объект DataSet.
DataSet ds = new DataSet("myDataSet");
// Создаётся таблица.
DataTable t = new DataTable("Items");
//Столбцы таблицы - это особые объекты.
//Имя первого столбца - id, тип значения - System.Int32. DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32")); c1.AutoIncrement=true;
//Имя второго столбца - Item, тип значения - System.Int32. DataColumn c2 = new DataColumn("Item", Type.GetType("System.Int32"));
//Сборка объекта DataSet:
//Добавляются объекты-столбцы...
t.Columns.Add(c1);
t.Columns.Add(c2);
//А вот массив столбцов (здесь он из одного элемента)
//для организации первичного ключа (множества первичных ключей). DataColumn[] keyCol= new DataColumn[1];
//И вот, собственно, как в таблице задаётся множество первичных ключей. keyCol[0]= c1;
//Свойству объекта t передаётся массив, содержащий столбцы, которые
//формируемая таблица t будет воспринимать как первичные ключи. t.PrimaryKey=keyCol;
//А что с этими ключами будет t делать? А это нас в данный момент
//не касается. Очевидно, что методы, которые обеспечивают контроль
//над информацией в соответствии со значениями ключей уже где-то
//"зашиты" в классе DataTable. Как и когда они будут выполняться -
//не наше дело. Наше дело - указать на столбцы, которые для данной
//таблицы будут ключевыми. Что мы и сделали.
//Таблица подсоединяется к объекту ds представителю класса DataSet. ds.Tables.Add(t);
DataRow r;
//В таблицу, которая уже присоединена к
//объекту ds DataSet добавляется 10 rows. for(int i = 0; i <10;i++)
{
r=t.NewRow(); r["Item"]= i; t.Rows.Add(r);
}
//Принять изменения.
//Так производится обновление DataSet'а.
//Сведения о новых изменениях и добавлениях будут фиксироваться
//вплоть до нового обновления.
ds.AcceptChanges(); PrintValues(ds, "Original values");
// Изменение значения в первых двух строках. t.Rows[0]["Item"]= 50;
232
t.Rows[1]["Item"]= 111; t.Rows[2]["Item"]= 111;
//Добавление ещё одной строки.
//Судя по всему, значение первого столбца устанавливается автоматически.
//Это ключевое поле со значением порядкового номера строки. r=t.NewRow();
r["Item"]=74;
t.Rows.Add(r);
//Объявляем ссылку для создания временного DataSet.
DataSet xSet;
//ДЕКЛАРАЦИЯ О НАМЕРЕНИЯХ КОНТРОЛЯ ЗА КОРРЕКТНОСТЬЮ ЗНАЧЕНИЙ СТРОКИ.
//Вот так добавляется свойство, содержащее строку для описания ошибки в значении.
//Наш DataSet содержит одну строку с описанием.
//Это всего лишь указание на то обстоятельство, что МЫ САМИ обязались осуществлять
//некоторую деятельность по проверке чего-либо. Чтобы не забыть, в чём проблема,
//описание возможной ошибки (в свободной форме!) и добавляем в свойства строки,
//значения которой требуют проверки.
t.Rows[0].RowError= "over 100 (ЙЦУКЕН!)"; t.Rows[1].RowError= "over 100 (Stupid ERROR!)"; t.Rows[2].RowError= "over 100 (Ну и дела!)";
//Но одно дело декларировать намерения, а другое – осуществлять контроль.
//Проблема проверки корректности значения – наша личная проблема.
//Однако о наших намерениях контроля за значениями становится известно
//объекту-представителю DataSet!
PrintValues(ds, "Modified and New Values");
//Мы вроде бы согласились проводить контроль значений.
//Даже декларировали некий принцип проверки.
//Однако, ничего само собой не происходит.
//Так вот,
//ЕСЛИ В ТАБЛИЦУ БЫЛИ ДОБАВЛЕНЫ СТРОКИ ИЛИ ИЗМЕНЕНЫ ЗНАЧЕНИЯ СТРОК
//И
//МЫ ОБЯЗАЛИСЬ КОНТРОЛИРОВАТЬ ЗНАЧЕНИЯ СТРОК В ТАБЛИЦЕ
//
//, то самое время организовать эту проверку...
//Критерий правильности значений, естественно, наш!
//Алгоритмы проверки - тоже НАШИ!
//Единственное, чем нам может помочь ADO.NET - это выделить
//подмножество строк таблицы,
//которые были добавлены или модифицированы со времени последнего
//обновления нашего объекта - представителя DataSet'а,
if(ds.HasChanges(DataRowState.Modified | DataRowState.Added)& ds.HasErrors)
{
//И для этого мы воспользуемся методом, который позволяет обеспечить выделение
//подмножества добавленных и модифицированных строк в новый объект DataSet'а.
//Use GetChanges to extract subset.
xSet = ds.GetChanges(DataRowState.Modified|DataRowState.Added); PrintValues(xSet, "Subset values");
//Insert code to reconcile errors. In this case, we'll reject changes.
//Вот, собственно, код проверки. Всё делается своими руками. foreach(DataTable xTable in xSet.Tables)
{
if (xTable.HasErrors)
{
foreach(DataRow xRow in xTable.Rows)
{
//Выделенное подмножество проверяем на наличие
//ошибочного значения (для нас всё, что больше 100 - уже ошибка!) Console.Write(xRow["Item"] + " "); if((int)xRow["Item",DataRowVersion.Current ]> 100)
{
//Находим ошибку в строке, сообщаем о ней, Console.WriteLine("Error! - " + xRow.RowError);
//Возвращаем старое значение...
233
xRow.RejectChanges();
//Отменяем значение свойства-уведомителя о возможных
//ошибках для данной строки...
xRow.ClearErrors();
}
else Console.WriteLine("OK.");
}
}
}
PrintValues(xSet, "Reconciled subset values");
//Сливаем изменённые и откорректированные строки в основной объект - DataSet
//Merge changes back to first DataSet.
ds.Merge(xSet);
PrintValues(ds, "Merged Values");
}
}
// А это всего лишь вывод содержимого DataSet'а.
private static void PrintValues(DataSet ds, string label)
{
Console.WriteLine("\n" + label); foreach(DataTable t in ds.Tables)
{
Console.WriteLine("TableName: " + t.TableName); foreach(DataRow r in t.Rows)
{
foreach(DataColumn c in t.Columns)
{
Console.Write("\t " + r[c] );
}
Console.WriteLine();
}
}
}
}
}
Подсоединенные объекты объектной модели ADO.NET. Провайдеры
Поставщик данных для приложения (Провайдер) – объект, предназначенный для обеспечения взаимодействия приложения с хранилищем информации (базами данных).
Естественно, приложению нет никакого дела до того, где хранится и как извлекается потребляемая приложением информация. Для приложения источником данных является тот, кто передаёт данные приложению. И как сам этот источник эту информацию добывает – никого не касается.
Источник данных (Data Provider) – это набор взаимосвязанных компонентов, обеспечивающих доступ к данным. Функциональность и само существование провайдера обеспечивается набором классов, специально дла этой цели разработанных.
ADO.NET поддерживает два типа источников данных, соответственно, два множества классов:
SQL Managed Provider (SQL Server.NET Data Provider) - для работы с Microsoft SQL Server 7.0 и выше. Работает по специальному протоколу, называемому
TabularData Stream (TDS) и не использует ни ADO, ни ODBC, ни какую-либо еще технологию. Ориентированный специально на MS SQL Server, протокол позволяет увеличить скорость передачи данных и тем самым повысить общую производительность приложения.
ADO Managed Provider (OleDb.NET Data Provider) - для всех остальных баз
данных. Обеспечивает работу с произвольными базами данных. Однако за счет универсальности есть проигрыш по сравнению с SQL Server Provider, так что при работе с SQL Server рекомендовано использовать специализированные классы.
234
В следующих разделах приводится описание соствных элементов провайдера.
Connection
Объект-представитель класса Connection представляет соединение с источником (базой) данных и обеспечивает подключение к базе данных. Visual Studio.NET поддерживает два класса:
SQLConnection (обеспечивает подключение к SQL Server 7.0 и выше),
OleDbConnection (обеспечивает подключение к прочим вариантам БД).
Компонента Connection (независимо от того, представителем какого класса она является) имеет свойство ConnectionString, в котором фиксируется вся необходимая для установления соединения с БД информация. Кроме того, поддерживается ряд методов, позволяющих обрабатывать данные с применением транзакций.
Свойства объекта Connection позволяют:
задавать реквизиты пользователя,
указывать расположение источника данных.
Методы объекта позволяют управлять соединением с источником данных. |
класса |
|||||
В |
процессе |
соединения |
с |
помощью |
объекта-представителя |
|
OleDbConnection (аналогично SQLConnection) создаётся и инициализируется соответствующий объект с использованием одного из вариантов конструктора и строки соединения.
Формирование строки и последовательность действий при инициализации объекта соединения – дело техники. Главное – это чтобы свойство ConnectionString в результате получило бы ссылку на строку символов, содержащую необходимую для установления соединения информацию.
// Объявили и определили объект соединения.
private System.Data.OleDb.OleDbConnection oleDbConnection1; this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection();
::::::::::
//Настроили объект соединения.
//Для наглядности необходимая для установления соединения
//информация представлена серией строк. oleDbConnection1.ConnectionString = @"Jet OLEDB:Global Partial Bulk Ops=2;" + @"Jet OLEDB:Registry Path=;" +
@"Jet OLEDB:Database Locking Mode=1;" +
@"Data Source=""F:\Users\Work\CS\DB.BD\DBTests\Lights.mdb"";" + @"Jet OLEDB:Engine Type=5;" +
@"Jet OLEDB:Global Bulk Transactions=1;" + @"Provider=""Microsoft.Jet.OLEDB.4.0"";" + // Поставщик @"Jet OLEDB:System database=;" +
@"Jet OLEDB:SFP=False;" + @"persist security info=False;" + @"Extended Properties=;" + @"Mode=Share Deny None;" +
@"Jet OLEDB:Create System Database=False;" + @"Jet OLEDB:Don't Copy Locale on Compact=False;" +
@"Jet OLEDB:Compact Without Replica Repair=False;" + @"User ID=Admin;" +
@"Jet OLEDB:Encrypt Database=False";
Свойства, методы и события класса OleDbConnection
Свойства.
ConnectionString |
string |
Строка, определяющая способ подключения объекта к |
|
|
источнику данных. |
ConnectionTimeout |
Int32 |
Интервал времени, в течение которого объект пытается |
|
|
установить соединение с источником данных (только для |
|
|
чтения). |
Container |
string |
Gets the IContainer that contains the Component. |
235
Database |
string |
Gets |
текущей |
базы |
данных |
или |
базы, |
которая |
|
|
использовалась после установления соединения. |
|
|||||
DataSource |
string |
Gets the server |
name or file name of the data source. |
|||||
|
|
Всё |
зависит от |
того, |
с каким |
хранилищем |
информации |
|
|
|
ведётся работа. Серверное хранилище данных (SQL Server, |
||||||
|
|
Oracle) – имя компа, выступающего в роли сервера. |
||||||
|
|
Файловые БД (Access) – имя файла. |
|
|
|
|||
Provider |
string |
Gets имя OLE DB провайдера, которое было объявлено в |
||||||
|
|
"Provider= …" clause строки соединения. |
|
|
||||
ServerVersion |
string |
Gets a string containing the version of the server to |
||||||
|
|
which the client is connected. |
|
|
|
|||
Site |
string |
Gets or sets the ISite of the Component. |
|
|
||||
State |
string |
Gets текущее состояние соединения. |
|
|
||||
Текущее |
состояние |
соединения |
кодируется |
|
как |
элемент |
перечисления |
||||||||||||
ConnestionState. Список возможных значений представлен ниже. |
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Имя члена |
|
Описание |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Value |
|
Broken |
|
The |
connection |
|
to the data source is broken. Подобное может |
|
16 |
||||||||||||
|
|
случиться только после того, |
как |
соединение |
было |
установлено. |
|
|
|||||||||||
|
|
A connection in this state may be closed and then re-opened. |
|
|
|||||||||||||||
|
|
(This value is reserved for future versions of the product.) |
|
|
|
||||||||||||||
Closed |
|
Соединение закрыто. |
|
|
|
|
|
|
|
|
|
|
|
|
0 |
||||
Connecting |
|
The |
connection |
object is connecting to the data source. (This |
|
2 |
|||||||||||||
|
|
value is reserved for future versions of the product.) |
|
|
|
|
|||||||||||||
Executing |
|
The |
connection |
|
object в процессе выполнения команды. (This |
4 |
|||||||||||||
|
|
value is reserved for future versions of the product.) |
|
|
|
|
|||||||||||||
Fetching |
|
Объект соединения занят |
выборкой |
данных. |
(This value |
is |
|
8 |
|||||||||||
|
|
reserved for future versions of the product.) |
|
|
|
|
|
|
|||||||||||
Open |
|
Соединение открыто. |
|
|
|
|
|
|
|
|
|
|
|
|
1 |
||||
Открытые методы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
BeginTransaction |
|
|
|
Перегружен. Начинает транзакцию базы данных. |
|
|
|
||||||||||||
ChangeDatabase |
|
|
|
Изменяет |
текущую |
|
базу |
данных |
для |
открытого |
|||||||||
|
|
|
|
|
|
OleDbConnection. |
|
|
|
|
|
|
|
|
|
|
|||
Close |
|
|
|
|
|
Закрывает |
подключение |
к |
источнику |
данных. |
Это |
||||||||
|
|
|
|
|
|
рекомендуемый |
метод |
закрытия |
любого |
открытого |
|||||||||
|
|
|
|
|
|
подключения. |
|
|
|
|
|
|
|
|
|
|
|
||
CreateCommand |
|
|
|
Создает и возвращает объект OleDbCommand, связанный с |
|||||||||||||||
|
|
|
|
|
|
OleDbConnection. |
|
|
|
|
|
|
|
|
|
|
|||
CreateObjRef (унаследовано от |
Создает объект, который содержит всю необходимую |
||||||||||||||||||
MarshalByRefObject) |
|
|
|
информацию для создания прокси-сервера, используемого |
|||||||||||||||
|
|
|
|
|
|
для коммуникации с удаленными объектами. |
|
|
|
||||||||||
Dispose |
(унаследовано |
от |
|
Перегружен. |
Освобождает |
ресурсы, |
используемые |
||||||||||||
Component) |
|
|
|
|
|
объектом Component. |
|
|
|
|
|
|
|
|
|
||||
EnlistDistributedTransaction |
|
Зачисляет |
в |
указанную |
|
транзакцию |
в |
качестве |
|||||||||||
|
|
|
|
|
|
распределенной транзакции. |
|
|
|
|
|
|
|||||||
Equals |
(унаследовано |
от |
|
Перегружен. Определяет, равны ли два экземпляра |
|||||||||||||||
Object) |
|
|
|
|
|
Object. |
|
|
|
|
|
|
|
|
|
|
|
|
|
GetHashCode (унаследовано |
от |
|
Служит |
хеш-функцией |
|
для |
конкретного |
типа, |
пригоден |
||||||||||
Object) |
|
|
|
|
|
для использования в алгоритмах хеширования и |
|||||||||||||
|
|
|
|
|
|
структурах данных, например в хеш-таблице. |
|
|
|
||||||||||
GetLifetimeService |
|
от |
|
Извлекает служебный объект текущего срока действия, |
|||||||||||||||
(унаследовано |
|
|
который управляет средствами срока действия данного |
||||||||||||||||
MarshalByRefObject) |
|
|
|
экземпляра. |
|
|
|
|
|
|
|
|
|
|
|
||||
GetOleDbSchemaTable |
|
|
|
Возвращает сведения схемы из источника данных так же, |
|||||||||||||||
|
|
|
|
|
|
как указано в GUID, и после применения указанных |
|||||||||||||
|
|
|
|
|
|
ограничений. |
|
|
|
|
|
|
|
|
|
|
|
||
GetType |
(унаследовано |
от |
|
Возвращает Type текущего экземпляра. |
|
|
|
|
|||||||||||
Object) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InitializeLifetimeService |
от |
|
Получает |
служебный |
|
объект |
срока |
действия, |
для |
||||||||||
(унаследовано |
|
|
управления |
|
средствами |
срока |
действия |
данного |
|||||||||||
MarshalByRefObject) |
|
|
|
экземпляра. |
|
|
|
|
|
|
|
|
|
|
|
||||
Open |
|
|
|
|
|
Открывает подключение к базе данных со значениями |
|||||||||||||
|
|
|
|
|
|
свойств, определяемыми ConnectionString. |
|
|
|
||||||||||
ReleaseObjectPool |
|
|
|
Статический. |
|
Означает, |
что |
пул |
объектов |
||||||||||
|
|
|
|
|
|
OleDbConnection |
может |
быть |
освобожден, |
когда |
|||||||||
|
|
|
|
|
|
последнее основное подключение будет освобождено. |
|||||||||||||
ToString |
(унаследовано |
от |
|
Возвращает String, который представляет текущий |
|||||||||||||||
Object) |
|
|
|
|
|
Object. |
|
|
|
|
|
|
|
|
|
|
|
|
|
236