Реализация доступа к базам данных в среде 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.
