Реализация доступа к базам данных в среде VISUAL STUDIO.NET на языке С++ с применением ATL
Добавление строк
Метод 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.