Основы проектирования приложений баз данных

       

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


Метод 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 - для получения полей длины и статуса.



Содержание раздела