Можно также выбрать подмножество данных из объекта DataSet (Набор данных). Метод Select (Выбрать) класса DataTable (Таблица данных) имеет синтаксис, совпадающий с синтаксисом фразы "where" в SQL-запросах. Для доступа к полям строки используются имена столбцов Ниже приведен пример из описания класса HotelBroker (Посредник, бронирующий места в гостинице), в котором этот метод используется для получения списка отелей определенного города.
ArrayList *GetHotels(String *city)
{
try
{
DataTable *t = hotelsDataset->
Tables->get_Item("Hotels"); // Гостиницы
DataRow *rows [] = t->Select( // Выбор
String::Format("City = '{0}'", city)); // Строка:: Формат ("Город = ' {0} ' ", город));
ArrayList *hotels = new ArrayList;
for (int i=0; i < rows->Length; i++)
{
String *name = rows[i]->get_Item(
"HotelName") ->ToString {) ->Tnm() ; // Вырезка
hotels->Add(name); // гостиницы-> Добавить (название);
}
return hotels; // гостиницы
}
catch(Exception *e) // Исключение
{
throw e;
}
}
Метод AddHotel класса HotelBroker (Посредник, бронирующий места в гостинице) иллюстрирует, как добавляется новая строка в объект DataSet (Набор данных) При этом создается новый экземпляр класса DataRow и для добавления данных в соответствующие поля используются имена столбцов
Если необходимо сохранить созданную строку в базе данных, используется метод Update (Обновить) класса SqlDataAdapter Он является промежуточным звеном между объектом DataSet (Набор данных) и базой данных Позже мы обсудим, как производить транзакционное редактирование набора данных для того, чтобы принять или отвергнуть изменения до их передачи в базу данных
String *AddHptel( // Строка
String *city, // Строка
String *name, // Строка
int number, // номер
Decimal rate) // Десятичная цена
{
try
{
DataTable *t = hotelsDataset->Tables->get_Item( // Таблицы
"Hotels"); // Гостиницы
DataRow *r = t->NewRow();
r->set_Item("HotelName", name); // название
r->set_Item("City", city); // ("Город", город)
r->set_Item("NumberRooms", _box(number));
r->set_Item("RoomRate", _box(rate));
t->Rows->Add(r); // Строки-> Добавить
hotelsAdapter->Update(hotelsDataset, "Hotels"); // Обновить "Гостиницы"
}
catch(Exception *e) // Исключение
{
throw e;
}
}
Для удаления строки из объекта DataSet (Набор данных) прежде всего необходимо найти эту строку или строки, а затем вызвать метод Delete (Удалить) для каждого из удаляемых экземпляров DataRow. Метод Remove (Удалить) удаляет экземпляр DataRow из коллекции Этот экземпляр не помечается как удаленный, так как он уже не является частью объекта DataSet (Набор данных) При вызове метода Update (Обновить) преобразователя данных соответствующие данные не будут удалены из базы данных Приведем фрагмент метода DeleteHotel класса HotelBroker (Посредник, бронирующий места в гостинице)
String *DeleteHotel(String *city, String *name) // Строка
*DeleteHotel (Строка *city, Строка *name)
{
try
{
t = hotelsDataset->Tables->get_Item("Hotels"); // Таблицы-> get_Item ("Гостиницы")
r = t->Select ( // Выбор String::Format(
// Строка:: Формат (
"City = '{0}' and HotelName = '{!}'",
// "Город = ' {0} ' и HotelName ='{!}' ",
city, name)); // город, название
for (i=0; i<r->Length; i++)
r[i]->Delete (); // Удалить
}
Для изменения строки набора данных достаточно просто найти эту строку и внести необходимые изменения в поля строки. В качестве примера ниже приведен фрагмент реализации метода ChangeRooms класса HotelBroker (Посредник, бронирующий места в гостинице). При вызове метода Update (Обновить) преобразователя данных, все изменения, сделанные в этом фрагменте, будут переданы базе данных.
String *ChangeRooms( // Строка
String *city, // Строка
String *name, // Строка
int numberRooms,
Decimal rate) // Десятичная цена
{
DataTable *t = 0;
try
{
t = hotelsDataset->Tables->get_Item("Hotels"); // Таблицы-> get_Item ("Гостиницы")
DataRow *r [] = t->Select( // Выбор
String::Format(
// Строка:: Формат (
"City = '{0}' and HotelName = '{I}1",
// "Город = ' {0} ' и HotelName = ' {1} ' ",
city, name)); // город, название
for (int i = 0; i < r->Length; i++) {
r[i]->set_Item("NumberRooms", _box(numberRooms));
r[i]->set_Item("RoomRate", _box(rate)) ; }
} }