Опубликован: 20.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 11:

Реализация доступа к базам данных в среде VISUAL STUDIO.NET на языке С++ с применением ATL

< Лекция 10 || Лекция 11: 12345 || Лекция 12 >

Добавление строк

Метод CRowset::Insert создает новую строку, используя данные из аксессора, и вставляет ее после текущей строки.

Метод Insert имеет следующее формальное описание:

HRESULT Insert(int nAccessor = 0, bool bGetRow = false)

Параметр bGetRow определяет, какая строка станет текущей: значение false (по умолчанию) указывает, что текущей будет новая вставленная строка; значение true указывает, что текущая строка не изменится.

В следующем примере иллюстрируется добавление новой строки после 10-й строки результирующего набора:

CTable<CAccessor<CTBL1Accessor> > tbl1;
CSession session;

// Открываем результирующий набор
tbl1.Open(session, "Product", &ps, 1);  // ps - набор
                                        // свойств
tbl1.MoveToBookmark(&bookmark, 0);      // Переход
                                   // на 10-ю строку
// Устанавливаем значение столбцов
tbl1.m_F1 = 2020;
_tcscpy( tbl1.m_F2, _T( "ABCD" ) );
tbl1.m_F3 = 137137;
tbl1.m_F4 = 456;
_tcscpy( tbl1.m_F5, _T( "123456789" ) );
tbl1.m_F6 = 3;
tbl1.m_F7 = false;

// До добавления строки следует инициализировать поля 
// состояния и длины
// Состояние столбцов
m_dwF1Status = DBSTATUS_S_ISNULL;  
m_dwF2Status = DBSTATUS_S_ISNULL;
m_dwF3Status = DBSTATUS_S_ISNULL;
m_dwF4Status = DBSTATUS_S_ISNULL;
m_dwF5Status = DBSTATUS_S_ISNULL;
m_dwF6Status = DBSTATUS_S_ISNULL;
m_dwF7Status = DBSTATUS_S_ISNULL;
// Длина строк
m_dwF2Length = 4;      // "ABCD" - это 6 символов
m_dwF5Length = 10;     // "123456789" - это 9 символов
// Добавление строки
HRESULT hr = tbl1.Insert( );

Поля статуса и длины для каждого поля записываются в таблице столбцов, указываемой после BEGIN_COLUMN_MAP (при использовании мастера ATL OLE DB Consumer эта таблица формируется автоматически).

Например:

[db_source("insert connection string")]
[db_command(" SELECT \
          Au_ID, \
          Author, \
      `   Year Born`, \
          FROM TblAuthors")]

class CAuthors
{
public:
   DWORD m_dwAuIDStatus;  // Поля статуса
   DWORD m_dwAuthorStatus;
   DWORD m_dwYearBornStatus;

   DWORD m_dwAuIDLength;    // Поля длины
   DWORD m_dwAuthorLength;
   DWORD m_dwYearBornLength;

BEGIN_COLUMN_MAP(CTblAuthorsAccessor)  // Таблица 
                                       // столбцов
   COLUMN_ENTRY_LENGTH_STATUS(1, m_AuID, 
                             dwAuIDLength, 
                             dwAuIDStatus)
   COLUMN_ENTRY_LENGTH_STATUS(2, m_Author, 
                             dwAuthorLength, 
                             dwAuthorStatus)
   COLUMN_ENTRY_LENGTH_STATUS(3, m_YearBorn, 
                             dwYearBornLength, 
                             dwYearBornStatus)
END_COLUMN_MAP()

[ db_column(1, status=m_dwAuIDStatus, length=m_dwAuIDLength) ] LONG m_AuID;
[ db_column(2, status=m_dwAuthorStatus, length=m_dwAuthorLength) ] TCHAR m_Author[51];
[ db_column(3, status=m_dwYearBornStatus, length=m_dwYearBornLength) ] SHORT m_YearBorn;

   void GetRowsetProperties(CDBPropSet* pPropSet)
   {
      pPropSet->AddProperty(DBPROP_IRowsetChange, 
                            true);
      pPropSet->AddProperty(DBPROP_UPDATABILITY, 
                     DBPROPVAL_UP_CHANGE | 
                     DBPROPVAL_UP_INSERT | 
                      DBPROPVAL_UP_DELETE);
   }
};

Для добавления входа в таблицу столбцов могут использоваться следующие макросы:

  • COLUMN_ENTRY_LENGTH - для получения поля длины;
  • COLUMN_ENTRY_STATUS - для получения поля статуса;
  • COLUMN_ENTRY_LENGTH_STATUS - для получения полей длины и статуса.

Отображение результирующего набора в элементах управления MFC

Для того чтобы отобразить OLE DB результирующий набор в MFC-приложении, следует использовать MFC-класс визуализации данных COleDBRecordView. Это позволит отобразить значения столбцов результирующего набора в элементах управления MFC.

Объект типа COleDBRecordView должен быть явно связан с результирующим набором, создаваемым OLE DB провайдером из класса CRowset.

Например:

COleDBRecordView myRecordView;
...
// CTBL1Accessor - класс записи
CRowset<CAccessor<CTBL1Accessor>> myRowSet = 
                          myRecordView.OnGetRowset();

Для отображения полей результирующего набора в элементах управления и для внесения изменений, сделанных в элементах управления, в полях результирующего набора используются DDX-методы. Переход между записями осуществляется вызовом функций MoveFirst, MoveNext, MovePrev и MoveLast.

< Лекция 10 || Лекция 11: 12345 || Лекция 12 >
Ирина Шелтер
Ирина Шелтер
Россия, Нижний Новгород, НГПУ им. К.Минина, 2011
Михаил Бородай
Михаил Бородай
Россия, г. Москва