FILE: GetRows.exe Demonstrates #import with ADO and GetRows()Last reviewed: March 6, 1998Article ID: Q172391 |
The information in this article applies to:
SUMMARYThe Visual C++ 5.0 GetRows sample is identical to the ADO GetRows sample that comes with the OLEDBSDK but is re-written to use the #import compiler directive, which was introduced in Visual C++ version 5.0. The code is much cleaner using #import and is less error-prone.
MORE INFORMATIONThe following file is available for download from the Microsoft Software Library:
~ GetRows.exe (size: 599958 bytes)For more information about downloading files from the Microsoft Software Library, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q119591 TITLE : How to Obtain Microsoft Support Files from Online ServicesThe demonstration code resides in two primary functions; OnExecute and DoGetRows(). Here is the code:
#import "c:\program files\Common Files\System\ADO\MSADO10.DLL" \
implementation_only
const _bstr_t bstrSource(_T("DRIVER=Microsoft Access Driver"
"(*.mdb);DBQ=nwind.mdb"));
const _bstr_t bstrUser(_T("Admin"));
const _bstr_t bstrPassword(_T(""));
const _bstr_t bstrSQL(_T("select EmployeeId, LastName, FirstName from"
"Employees"));
void CVC5GetRowsDlg::OnExecute()
{
HRESULT hr;
try
{
if ( m_pConn == NULL || m_pRS == NULL)
{
hr = CoInitialize(NULL);
if (FAILED(hr))
{
AfxMessageBox(_T("Failure to Initialize OLE"));
return;
}
m_pConn.CreateInstance(_uuidof(ADODB::Connection));
m_pConn->Open( bstrSource, bstrUser, bstrPassword );
m_pRS.CreateInstance(_uuidof(ADODB::Recordset));
m_pRS->PutSource(bstrSQL);
m_pRS->ActiveConnection = m_pConn;
_variant_t vNull;
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND;
m_pRS->Open(vNull, vNull, ADODB::adOpenKeyset,
ADODB::adLockOptimistic, ADODB::adCmdUnknown);
}
// Perform the two GetRows functions
DoGetRows();
// Reset the recordset
m_pRS->MoveFirst();
}
catch(_com_error & err)
{
::MessageBox(NULL, (LPCSTR)err.Description(), _T("ADO Error"), MB_OK);
}
}
void CVC5GetRowsDlg::DoGetRows()
{
ASSERT(m_pRS!=NULL);
HRESULT hr;
_variant_t cRows;
_variant_t varField, varNewField;
CString strLBRow;
LONG lNumOfCol, lNumRecords;
LONG lIndex[2];
CListBox *pListBox = (CListBox *)GetDlgItem(IDD_GETROWSLIST);
//Perform GetRows on Employee table
// NOTE: #import generates vtMissing for default arguments which
// evaluates to a variant with vt=VT_ERROR and
// scode = DISP_E_PARAMNOTFOUND.
// vtMissing is used for the optional second and third
// arguments in the GetRows call. If vtMissing is used,
// GetRows starts from the current record and gets all columns
cRows = m_pRS->GetRows(ADODB::adGetRowsRest);
//Find out how many records were actually retrieved
//(SafeArrays are 1-based)
lNumOfCol = 2;
SafeArrayGetUBound(cRows.parray, 2, &lNumRecords);
//Clear the listbox
pListBox->ResetContent();
for (lIndex[1] = 0; lIndex[1] <= lNumRecords; lIndex[1]++)
{
strLBRow.Empty();//Clear the string
for (lIndex[0] = 0; lIndex[0] <= lNumOfCol; lIndex[0]++)
// get 3 columns
{
SafeArrayGetElement(cRows.parray, &lIndex[0], &varField);
hr = VariantChangeType(&varNewField, &varField, 0, VT_BSTR);
if(hr == S_OK)
{
strLBRow += (LPCWSTR)varNewField.bstrVal;
if (lIndex[0] != lNumOfCol)
strLBRow += _T(", ");
}
varField.Clear();
varNewField.Clear();
}
pListBox->AddString(strLBRow);
}
}
For additional information, please see the following articles in the
Microsoft Knowledge Base:
ARTICLE-ID: Q169496 TITLE : INFO: Using ActiveX Data Objects (ADO) via #import in VC++ ARTICLE-ID: Q166112 TITLE : PRB: Conflict with EOF When Using #import with ADO ARTICLE-ID: Q169498 TITLE : INFO: Extracting Error Information from ADO in VC++ with #import Keywords : kbcode adovc Technology : odbc Version : WINDOWS: Platform : WINDOWS Issue type : kbfile Solution Type : kbsample |
================================================================================
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |