Attributes Property Example (VC++)
This example demonstrates the Attributes property of a Column. Setting it to adColNullable allows the user to set the value of a Recordset Field to an empty string. In this situation, the user can distinguish between a record where data is not known and a record where the data does not apply.
// Attributes_Property_Sample.cpp
// compile with: /EHsc
#import "msado15.dll" rename("EOF", "EndOfFile")
#import "msadox.dll" no_namespace
#include "iostream"
#include "icrsint.h"
using namespace std;
// class extracts LastName, FirstName, FaxPhone from Employees table
class CEmployeeRs : public CADORecordBinding {
BEGIN_ADO_BINDING(CEmployeeRs)
// Column LastName is the 2nd field in the table
ADO_VARIABLE_LENGTH_ENTRY2(2,
adVarChar,
m_szemp_LastName,
sizeof(m_szemp_LastName),
lemp_LastNameStatus,
TRUE)
// Column FirstName is the 17th field in the table
ADO_VARIABLE_LENGTH_ENTRY2(17,
adVarChar,
m_szemp_FirstName,
sizeof(m_szemp_FirstName),
lemp_FirstNameStatus,
TRUE)
// Column FaxPhone is the 18th field in the table
ADO_VARIABLE_LENGTH_ENTRY2(18,
adVarChar,
m_szemp_Faxphone,
sizeof(m_szemp_Faxphone),
lemp_FaxphoneStatus,
TRUE)
END_ADO_BINDING()
public:
CHAR m_szemp_LastName[21];
ULONG lemp_LastNameStatus;
CHAR m_szemp_FirstName[11];
ULONG lemp_FirstNameStatus;
CHAR m_szemp_Faxphone[25];
ULONG lemp_FaxphoneStatus;
};
inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };
int main() {
if ( FAILED( ::CoInitialize(NULL) ) )
return -1;
HRESULT hr = S_OK;
char * token;
// Define ADOX object pointers, initialize pointers. These are in ADODB namespace.
_CatalogPtr m_pCatalog = NULL;
_ColumnPtr m_pColumn = NULL;
_TablePtr m_pTable = NULL;
// Define ADODB object pointers
ADODB::_ConnectionPtr m_pCnn = NULL;
ADODB::_RecordsetPtr m_pRstEmployees = NULL;
IADORecordBinding *picRs = NULL; // Interface Pointer Declared
CEmployeeRs emprs; // C++ Class Object
// Define string variables.
_bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';Data Source= 'c:\\Northwind.mdb';");
try {
// Connect the catalog.
TESTHR(hr = m_pCnn.CreateInstance(__uuidof (ADODB::Connection)));
TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
TESTHR(hr = m_pColumn.CreateInstance(__uuidof(Column)));
TESTHR(hr = m_pRstEmployees.CreateInstance(__uuidof(ADODB::Recordset)));
m_pCnn->Open(strcnn, "", "", NULL);
m_pCatalog->PutActiveConnection(_variant_t((IDispatch *) m_pCnn));
m_pTable= m_pCatalog->Tables->GetItem("Employees");
// Create a new Field object and append it to the Fields
// collection of the Employees table.
m_pColumn->Name = "FaxPhone";
m_pColumn->Type = adVarWChar;
m_pColumn->DefinedSize = 24;
m_pColumn->Attributes = adColNullable;
m_pCatalog->Tables->GetItem("Employees")->Columns->Append(m_pColumn->Name, adVarWChar, 24);
// Append("FaxPhone", adVarWChar, 24);
// Open the Employees table for updating as a Recordset.
m_pRstEmployees->Open("Employees",
_variant_t((IDispatch *) m_pCnn),
ADODB::adOpenKeyset,
ADODB::adLockOptimistic,
ADODB::adCmdTable);
// Get user input.
printf("Enter fax number for : %s %s\n",
(LPSTR)(_bstr_t) m_pRstEmployees->Fields->GetItem("LastName")->Value,
(LPSTR) (_bstr_t) m_pRstEmployees->Fields->GetItem("FirstName")->Value);
printf("[? - unknown, X - has no fax] : \n");
// Skip user input routine, just supply a value.
char* strTemp = strtok_s("X", " \t", &token);
_variant_t vNull;
vNull.vt = VT_BSTR;
vNull.bstrVal = NULL;
if (strTemp != NULL) {
if (strcmp(strTemp, "?") == 0)
m_pRstEmployees->Fields->GetItem("FaxPhone")->PutValue(vNull);
else if( (strcmp(strTemp,"X") == 0) | (strcmp(strTemp,"x") == 0) )
m_pRstEmployees->Fields->GetItem("FaxPhone")->PutValue("");
else
m_pRstEmployees->Fields->GetItem("FaxPhone")->PutValue(strTemp);
m_pRstEmployees->Update();
// Open IADORecordBinding interface pointer for binding Recordset to a class
TESTHR(hr = m_pRstEmployees->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));
// Bind the Recordset to a C++ class here
TESTHR(hr = picRs->BindToRecordset(&emprs));
// Print report.
printf("\nName - Fax number\n");
printf("%s %s ", emprs.lemp_LastNameStatus == adFldOK ?
emprs.m_szemp_LastName : "<NULL>",
emprs.lemp_FirstNameStatus == adFldOK ?
emprs.m_szemp_FirstName : "<NULL>");
if (emprs.lemp_FaxphoneStatus == adFldNull)
printf("- [Unknown]\n");
else if (strcmp((LPSTR)emprs.m_szemp_Faxphone, "") == 0)
printf("- [Has no fax]\n");
else
printf("- %s\n", emprs.m_szemp_Faxphone);
}
// Delete new field because this is a demonstration.
// m_pTable->Columns->Delete(m_pColumn->Name);
}
catch(_com_error &e) {
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\n\tSource : %s \n\tdescription : %s \n ", (LPCSTR)bstrSource, (LPCSTR)bstrDescription);
}
catch(...) {
cout << "Error occurred in AttributesX...." << endl;
}
if (m_pRstEmployees)
if (m_pRstEmployees->State == 1)
m_pRstEmployees->Close();
// Delete new field because this is a demonstration.
if (m_pTable != NULL)
m_pTable->Columns->Delete(m_pColumn->Name);
if (m_pCnn)
if (m_pCnn->State == 1)
m_pCnn->Close();
// Release the IADORecordset Interface here
if (picRs)
picRs->Release();
::CoUninitialize();
}