Attributes, exemple de propriété (VC++)

Cet exemple illustre la propriété Attributes d’une colonne. La définition de ce paramètre sur adColNullable permet à l’utilisateur de définir la valeur d’un champRecordset sur une chaîne vide. Dans ce cas, l’utilisateur peut faire la distinction entre un enregistrement où les données ne sont pas connues et un enregistrement où les données ne s’appliquent pas.

// 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();  
}  

Voir aussi

Attributes, propriété (ADOX)
Column, objet (ADOX)