Обновление источника данных
Каким образом метод SqlDataAdapter::Update (Обновить) передает источнику данных информацию о произведенных изменениях? Изменения, внесенные в объект DataSet (Набор данных), передаются базе данных с помощью свойств InsertCommand, UpdateCommand (Команда обновления) и DeleteCommand класса SqlDataAdapter. Каждому из этих свойств присваивается экземпляр SqlCommand, который может быть параметризован для того, чтобы поставить в соответствие переменные программы частям SQL-запроса. Продемонстрируем это на примере кода, взятого из реализации конструктора класса HotelBroker (Посредник, бронирующий места в гостинице).
Экземпляр SqlCommand создается для представления параметризованного SQL-запроса, который используется при вызове метода SqlDataAdapter::Update (Обновить) для добавления в базу данных новой строки. В момент вызова метода вместо параметров будут подставлены фактические значения.
SqlCommand *cmd = new SqlCommand( "insert Hotels(City, HotelName, NumberRooms, RoomRate) // "вставить Гостиницы (Город, HotelName, // NumberRooms, RoomRate) values(@City, @Name, SNumRooms, @RoomRate)", // значения conn);
Параметры должны быть связаны с соответствующими столбцами в DataRow. Во фрагменте кода метода AddHotel, рассмотренного ранее, столбцы различались по именам: HotelName, City (Город), NumberRooms, RoomRate. В конструкторе SqlParame-ter им соответствуют параметры @Name, @City, @NumRooms, @RoomRate.
Последний аргумент инициализирует свойство Source (Источник) объекта SqlParameter. Свойство Source (Источник) определяет столбец объекта DataSet (Набор данных), которому соответствует параметр. Метод Add (Добавить) помещает параметр в коллекцию объектов Parameter (Параметр), связанную с экземпляром SqlCommand.
SqlParameter *param = new SqlParameter( "@City", SqlDbType::Char, 20, "City"); cmd › Parameters › Add(param); // Параметры › Добавить cmd › Parameters › Add(new SqlParameter(// Параметры › Добавить "@Name", SqlDbType::Char, 20, "HotelName")); cmd › Parameters › Add (new SqlParameter(// Параметры › Добавить "@NumRooms", SqlDbType::Int, 4, "NumberRooms")); cmd › Parameters › Add(new SqlParameter(// Параметры › Добавить "@RoomRate", SqlDbType::Money, 8, "RoomRate"));
И, наконец, свойству InsertCommand класса SqlDataAdapter присваивается указатель на экземпляр класса SqlCommand. Отныне именно эта команда будет использоваться при вставке строки в базу данных:
hotelsAdapter › InsertCommand = cmd;
Аналогичный исходный код есть в конструкторе класса HotelBroker (Посредник, бронирующий места в гостинице). Различие лишь в том, что там устанавливаются значения свойств UpdateCommand (Команда обновления) и DeleteCommand для определения команд обновления и удаления строк.
hotelsAdapter › UpdateCommand = new SqlCommand( "update Hotels set NumberRooms = @NumRooms, RoomRate = @RoomRate where City = @City and HotelName = @Name", // где Город = @City и HotelName = @Name ", conn); hotelsAdapter › UpdateCommand › Parameters › Add( // Параметры › Добавить new SqlParameter( "@City", SqlDbType::Char,20, "City")); hotelsAdapter › UpdateCommand › Parameters › Add( // Параметры › Добавить new SqlParameter( "@Name", SqlDbType:-.Char, 20, "HotelName")); hotelsAdapter › UpdateCommand › Parameters › Add( // Параметры › Добавить new SqlParameter( "@NumRooms", SqlDbType::Int, 4, "NumberRooms")); hotelsAdapter › UpdateCommand › Parameters › Add( // Параметры › Добавить new SqlParameter( "@RoomRate",SqlDbType::Money, 8, "RoomRate")); hotelsAdapter › DeleteCoiranand = new SqlCommand( "delete from Hotels where City = @City and HotelName = // "удалить из Гостиниц где Город = @City и HotelName = @Name", conn); hotelsAdapter › DeleteCommand › Parameters › Add( // Параметры › Добавить new SqlParameter( "SCity", SqlDbType::Char, 20, "City")); hotelsAdapter › DeleteCommand › Parameters › Add( // Параметры › Добавить new SqlParameter( "@Name", SqlDbType::Char, 20, "HotelName"));
Все изменения, внесенные в объект DataSet (Набор данных), будут переданы базе данных при выполнении метода SqlDataAdapter::Update (Обновить). Как принять или отменить внесенные изменения до вызова этого метода, будет рассмотрено в следующем разделе.