The following code example demonstrates how to retrieve data.
Create a Command object:
ICommandText* pICommandText; hr = pIDBCreateCommand->CreateCommand( NULL, IID_ICommandText, (IUnknown**)&pICommandText);
Set the SQL statement:
hr = pICommandText->SetCommandText( DBGUID_DBSQL, L"SELECT * FROM testReadStringData");
Create and describe the rowset data structure. This structure contains fields for each column you want accessed, as shown:
IAccessor* pIAccessor; hr = pICommandText->QueryInterface(IID_IAccessor, (void**)&pIAccessor); static DBBINDING ExactBindings [1] = { { 1, // iOrdinal offsetof (ExactlyTheSame,s), // obValue 0, // No length binding 0, // No Status binding NULL, // No TypeInfo NULL, // No Object NULL, // No Extensions DBPART_VALUE, DBMEMOWNER_CLIENTOWNED, // Ignored DBPARAMIO_NOTPARAM, sizeof(mystr), // number of bytes 0, DBTYPE_WSTR | DBTYPE_BYREF, 0, // No Precision 0 // No Scale } }; DBBINDSTATUS status[1]; HACCESSOR hAccessor; HRESULT hr = pIAccessor->CreateAccessor( DBACCESSOR_ROWDATA, 1, ExactBindings, sizeof(ExactlyTheSame), &hAccessor, status); pIAccessor->Release();
Execute the rowset:
DBROWCOUNT cRowsAffected; IRowset* pIRowset; hr = pICommandText->Execute( NULL, IID_IRowset, params, &cRowsAffected, (IUnknown**)&pIRowset);
Use the following code to get the rows one row at a time:
DBCOUNTITEM cRowsReturned; HROW hRow[1]; HROW* pRow = hRow; hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsReturned, &pRow);
Use IMalloc to free the memory allocated by GetData:
CComPtr<IMalloc> pIMalloc = NULL; hr = CoGetMalloc( MEMCTX_TASK, &pIMalloc ); while (hr == S_OK) {
Retrieve the data for the specified row, for example:
ExactlyTheSame pData[1] = { {NULL} }; hr = pIRowset->GetData(hRow[0], hAccessor, pData); wchar_t* value = pData[0].s;
Free the allocated memory:
// client owned memory must be freed by the client pIMalloc->Free(pData[0].s); pData[0].s = NULL;
Release the rows:
hr = pIRowset->ReleaseRows(1, pRow, NULL, NULL, NULL);
Get the next row:
hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsReturned, &pRow); } pIRowset->Release(); pICommandText->Release();
Get the next row:
hr = pIRowset->GetNextRows(NULL, 0, 1, &cRowsReturned, &pRow); } pIRowset->Release(); pICommandText->Release();
To retrieve rows from a database, execute a SELECT statement using ICommandText::Execute. This opens a cursor on the statement.Then, use IRowset::GetNextRows to fetch rows through the cursor. When an application frees the statement by releasing the rowset, it closes the cursor.