PrimaryKey and Unique properties example (VC++)

Applies to: Access 2013, Office 2013

This example demonstrates the PrimaryKey and Unique properties of an Index. The code creates a new table with two columns. The PrimaryKey and Unique properties are used to make one column the primary key for which duplicate values are not allowed.

 
// BeginPrimaryKeyCpp 
#import "c:\program files\common files\system\ado\msadox.dll" no_namespace 
#import "c:\program files\common files\system\ado\msado15.dll" 
 
#include "iostream.h" 
#include "stdio.h" 
#include "conio.h" 
 
//Function Declarations 
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);}; 
void PrimaryKeyX(void); 
 
////////////////////////////////////////////////////////// 
// // 
// Main Function // 
// // 
////////////////////////////////////////////////////////// 
void main() 
{ 
 if(FAILED(::CoInitialize(NULL))) 
 return; 
 
 PrimaryKeyX(); 
 
 ::CoUninitialize(); 
} 
 
////////////////////////////////////////////////////////// 
// // 
// PrimaryKeyX Function // 
// // 
////////////////////////////////////////////////////////// 
void PrimaryKeyX() 
{ 
 HRESULT hr = S_OK; 
 
 // Define ADOX object pointers. 
 // Initialize pointers on define. 
 // These are in the ADOX:: namespace. 
 _CatalogPtr m_pCatalog = NULL; 
 _TablePtr m_pTableNew = NULL; 
 _IndexPtr m_pIndexNew = NULL; 
 _IndexPtr m_pIndex = NULL; 
 _ColumnPtr m_pColumn = NULL; 
 
 //Define string variable 
 _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';" 
 "Data Source = 'c:\\Program Files\\" 
 "Microsoft Office\\Office\\Samples\\Northwind.mdb';"); 
 
 try 
 { 
 TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog))); 
 TESTHR(hr = m_pTableNew.CreateInstance(__uuidof(Table))); 
 TESTHR(hr = m_pIndexNew.CreateInstance(__uuidof(Index))); 
 TESTHR(hr = m_pIndex.CreateInstance(__uuidof(Index))); 
 TESTHR(hr = m_pColumn.CreateInstance(__uuidof(Column))); 
 
 // Connect the catalog 
 m_pCatalog->PutActiveConnection(strcnn); 
 
 // Name new table 
 m_pTableNew->Name = "NewTable"; 
 
 // Append a numeric and a text field to new table. 
 m_pTableNew->Columns->Append("NumField", adInteger, 20); 
 m_pTableNew->Columns->Append("TextField", adVarWChar, 20); 
 
 // Append new Primary Key index on NumField column 
 // to new table 
 m_pIndexNew->Name = "NumIndex"; 
 m_pIndexNew->Columns->Append("NumField",adInteger,0); 
 // here "-1" is required instead of "true". 
 m_pIndexNew->PutPrimaryKey(-1); 
 m_pIndexNew->PutUnique(-1); 
 m_pTableNew->Indexes->Append( 
 _variant_t ((IDispatch*)m_pIndexNew)); 
 
 // Append an index on Textfield to new table. 
 // Note the different technique: Specifying index and 
 // column name as parameters of the Append method 
 m_pTableNew->Indexes->Append("TextIndex", "TextField"); 
 
 // Append the new table 
 m_pCatalog->Tables->Append(_variant_t ((IDispatch*)m_pTableNew)); 
 
 cout << m_pTableNew->Indexes->Count << " Indexes in " 
 << m_pTableNew->Name << " Table" << endl; 
 m_pCatalog->Tables->Refresh(); 
 
 _variant_t vIndex; 
 // Enumerate Indexes collection. 
 for (long lIndex = 0;lIndex < m_pTableNew->Indexes->Count; 
 lIndex++) 
 { 
 vIndex = lIndex; 
 m_pIndex = m_pTableNew->Indexes->GetItem(vIndex); 
 cout << "Index " << m_pIndex->Name << endl; 
 cout << " Primary key = " << (m_pIndex->GetPrimaryKey() ? 
 "True" : "False") << endl; 
 cout << " Unique = " << (m_pIndex->GetUnique() ? "True" : 
 "False") << endl; 
 
 // Enumerate Columns collection of each Index 
 // object. 
 cout << " Columns" << endl; 
 
 for (long lIndex = 0;lIndex < m_pIndex->Columns->Count; 
 lIndex++) 
 { 
 vIndex = lIndex ; 
 m_pColumn = m_pIndex->Columns->GetItem(vIndex); 
 cout << " " << m_pColumn->Name << endl; 
 } 
 } 
 
 // Delete new table as this is a demonstration 
 m_pCatalog->Tables->Delete(m_pTableNew->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 occured in PrimaryKeyX...."<< endl; 
 } 
 
 m_pCatalog = NULL; 
} 
// EndPrimaryKeyCpp