This example demonstrates the DefinedSize property of a Column. The code will redefine the size of the FirstName column of the Employees table of the Northwind database. Then, the change in the values of the FirstName Field of a Recordset based on the Employees table is displayed. Note that by default, the FirstName field becomes padded with spaces after you redefine the DefinedSize property.
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
no_namespace
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
rename("EOF", "EndOfFile")
#include "iostream.h"
#include "stdio.h"
#include "conio.h"
// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DefinedSizeX(void);
//////////////////////////////////////////////////////////
// //
// Main Function //
// //
//////////////////////////////////////////////////////////
void main()
{
if(FAILED(::CoInitialize(NULL)))
return;
DefinedSizeX();
::CoUninitialize();
}
//////////////////////////////////////////////////////////
// //
// DefinedSizeX Function //
// //
//////////////////////////////////////////////////////////
void DefinedSizeX(void)
{
HRESULT hr = S_OK;
// Define ADOX object pointers.
// Initialize pointers on define.
// These are in the ADOX:: namespace.
_CatalogPtr m_pCatNorthwind = NULL;
_ColumnPtr m_pColFirstName = NULL;
_ColumnPtr m_pColNewFirstName = NULL;
// Define ADODB object pointers
ADODB::_RecordsetPtr m_pRstEmployees = NULL;
// Define string variables.
_bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;data source="
"c:\\Program Files\\Microsoft Office\\Office\\Samples\\"
"Northwind.mdb;");
_bstr_t aryFirstName[10];
try
{
// Open a Recordset for the Employees table.
TESTHR(hr = m_pRstEmployees.CreateInstance(
__uuidof(ADODB::Recordset)));
TESTHR(hr = m_pCatNorthwind.CreateInstance(__uuidof (Catalog)));
TESTHR(hr = m_pColNewFirstName.CreateInstance(__uuidof(Column)));
m_pRstEmployees->Open("Employees",strCnn,ADODB::adOpenKeyset,
ADODB::adLockReadOnly,ADODB::adCmdTable);
long lngSize = m_pRstEmployees->RecordCount;
aryFirstName[lngSize];
// Open a catalog for the Northwind database,
// using same connection as rstEmployees.
m_pCatNorthwind->PutActiveConnection(m_pRstEmployees->
GetActiveConnection());
// Loop through the recordset displaying the contents,
// of the FirstName field, the field's defined size,
// and its actual size.
// Also store FirstName values in aryFirstName array.
m_pRstEmployees->MoveFirst();
printf("\nOriginal Defined Size and Actual Size");
int iCount=0;
while (!(m_pRstEmployees->EndOfFile))
{
printf("\nEmployee Name:");
printf("%s ",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
GetItem("FirstName")->Value);
printf("%s\n",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
GetItem("LastName")->Value);
printf(" FirstName Defined size: %d\n",m_pRstEmployees->
Fields->GetItem("FirstName")->DefinedSize) ;
printf(" FirstName Actual size: %d\n",m_pRstEmployees->
Fields->GetItem("FirstName")->ActualSize);
aryFirstName[iCount] = (_bstr_t) m_pRstEmployees->Fields->
GetItem("FirstName")->Value;
m_pRstEmployees->MoveNext();
iCount++;
if(iCount%5==0)
{
printf("Press any key to continue...");
getch();
system("cls");
}
}
m_pRstEmployees->Close();
// Redefine the DefinedSize of FirstName in the catalog.
m_pColFirstName = m_pCatNorthwind->Tables->GetItem("Employees")->
Columns->GetItem("FirstName");
m_pColNewFirstName->Name = m_pColFirstName->Name;
m_pColNewFirstName->Type = m_pColFirstName->Type;
m_pColNewFirstName->DefinedSize =
(m_pColFirstName->DefinedSize) + 1;
// Append new FirstName column to catalog.
m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
Delete(m_pColFirstName->Name);
m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
Append(_variant_t((IDispatch*)m_pColNewFirstName,true),
adVarWChar,m_pColNewFirstName->DefinedSize);
// Open Employee table in Recordset for updating.
m_pRstEmployees->Open("Employees",m_pCatNorthwind->
GetActiveConnection(),ADODB::adOpenKeyset,
ADODB::adLockOptimistic,ADODB::adCmdTable);
// Loop through the recordset displaying the contents
// of the FirstName field,the field's defined size,
// and its actual size.
// Also restore FirstName values from aryFirstName.
printf("Press any key to continue...");
getch();
system("cls");
m_pRstEmployees->MoveFirst();
printf("\n\nNew Defined Size and Actual Size");
iCount=0;
while (!(m_pRstEmployees->EndOfFile))
{
m_pRstEmployees->Fields->GetItem("FirstName")->Value =
aryFirstName[iCount];
printf("\nEmployee Name: ");
printf("%s ",(LPSTR) (_bstr_t)m_pRstEmployees->Fields->
GetItem("FirstName")->Value);
printf("%s\n",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
GetItem("LastName")->Value);
printf(" FirstName Defined size: %d\n",m_pRstEmployees->
Fields->GetItem("FirstName")->DefinedSize );
printf(" FirstName Actual size: %d\n",m_pRstEmployees->
Fields->GetItem("FirstName")->ActualSize );
m_pRstEmployees->MoveNext();
iCount++;
if(iCount%5==0)
{
printf("Press any key to continue...");
getch();
system("cls");
}
}
m_pRstEmployees->Close();
// Restore original FirstName column to catalog
m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
Delete(m_pColNewFirstName->Name);
m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
Append(_variant_t((IDispatch*)m_pColFirstName,true),
adVarWChar,m_pColFirstName->DefinedSize);
// Restore original FirstName values to Employees table.
m_pRstEmployees->Open("Employees",m_pCatNorthwind->
GetActiveConnection(),ADODB::adOpenKeyset,
ADODB::adLockOptimistic,ADODB::adCmdTable);
m_pRstEmployees->MoveFirst();
iCount = 0;
while(!(m_pRstEmployees->EndOfFile))
{
m_pRstEmployees->Fields->GetItem("FirstName")->Value =
aryFirstName[iCount];
m_pRstEmployees->MoveNext();
iCount++;
}
m_pRstEmployees->Close();
m_pCatNorthwind = NULL;
}
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 occured in include files...."<< endl;
}
}