PrimaryKey et Unique, exemples de propriétés (VC++)
Cet exemple illustre les propriétés PrimaryKey et Unique d’un index. Le code crée une nouvelle table avec deux colonnes. Les propriétés PrimaryKey et Unique sont utilisées pour faire d’une colonne la clé primaire pour laquelle les valeurs en double ne sont pas autorisées.
// BeginPrimaryKeyCpp.cpp
// compile with: /EHsc
#import "msado15.dll" rename("EOF", "EndOfFile")
#import "msadox.dll" no_namespace
#include "iostream"
using namespace std;
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
int main() {
if ( FAILED(::CoInitialize(NULL)) )
return -1;
HRESULT hr = S_OK;
// Define and initialize ADOX object pointers. These are in ADODB 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:\\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 occurred in PrimaryKeyX...." << endl;
}
m_pCatalog = NULL;
::CoUninitialize();
}