Méthodes de consommateur générées par l'Assistant
L’Assistant Consommateur OLE DB ATL n’est pas disponible dans Visual Studio 2019 et versions ultérieures. Vous pouvez toujours ajouter la fonctionnalité manuellement.
L’Assistant Consommateur OLE DB ATL et l’Assistant Application MFC génèrent certaines fonctions que vous devriez connaître. Certaines méthodes sont implémentées différemment dans les projets avec attributs et présentent donc quelques risques à prendre en compte. Chaque cas est expliqué ci-après. Pour plus d’informations sur l’affichage de code injecté, consultez Débogage de code injecté.
OpenAll
ouvre la source de données ainsi que les ensembles de lignes et active les signets s’ils sont disponibles.CloseAll
ferme tous les ensembles de lignes et libère toutes les exécutions de commande.OpenRowset
est appelé parOpenAll
pour ouvrir l’ensemble de lignes ou des ensembles de lignes du consommateur.GetRowsetProperties
récupère un pointeur pour l’ensemble de propriétés de l’ensemble de lignes qui permet de définir les propriétés.OpenDataSource
ouvre la source de données à l’aide de la chaîne d’initialisation que vous avez spécifiée dans la boîte de dialogue Propriétés des liaisons de données.CloseDataSource
ferme la source de données de manière appropriée.
OpenAll et CloseAll
HRESULT OpenAll();
void CloseAll();
L’exemple suivant montre comment vous pouvez appeler OpenAll
et CloseAll
lorsque vous exécutez la même commande plusieurs fois. Comparez l’exemple de code dans CCommand::Close, qui montre une variation qui appelle Close
et ReleaseCommand
au lieu de CloseAll
.
int main(int argc, char* argv[])
{
HRESULT hr;
hr = CoInitialize(NULL);
CCustOrdersDetail rs; // Your CCommand-derived class
rs.m_OrderID = 10248; // Open order 10248
hr = rs.OpenAll(); // (Open also executes the command)
hr = rs.MoveFirst(); // Move to the first row and print it
printf( "Name: %s, Unit Price: %d, Quantity: %d, Discount %d, Extended Price %d\n", rs.m_ProductName, rs.m_UnitPrice.int64, rs.m_Quantity, rs.m_Discount, rs.m_ExtendedPrice.int64 );
// Close the first command execution
rs.Close();
rs.m_OrderID = 10249; // Open order 10249 (a new order)
hr = rs.Open(); // (Open also executes the command)
hr = rs.MoveFirst(); // Move to the first row and print it
printf( "Name: %s, Unit Price: %d, Quantity: %d, Discount %d, Extended Price %d\n", rs.m_ProductName, rs.m_UnitPrice.int64, rs.m_Quantity, rs.m_Discount, rs.m_ExtendedPrice.int64 );
// Close the second command execution;
// Instead of rs.CloseAll() you could call
// rs.Close() and rs.ReleaseCommand():
rs.CloseAll();
CoUninitialize();
return 0;
}
Notes
Si vous définissez une méthode HasBookmark
, le code OpenAll
définit la propriété DBPROP_IRowsetLocate
. Faites-le seulement si votre fournisseur prend en charge cette propriété.
OpenRowset
// OLE DB Template version:
HRESULT OpenRowset(DBPROPSET* pPropSet = NULL)
// Attribute-injected version:
HRESULT OpenRowset(const CSession& session, LPCWSTR szCommand = NULL);
OpenAll
appelle cette méthode pour ouvrir l’ensemble de ligne ou les ensembles de lignes dans le consommateur. En règle générale, vous n’avez pas besoin d’appeler OpenRowset
, sauf si vous souhaitez travailler avec plusieurs sources de données/sessions/ensembles de lignes. OpenRowset
est déclaré dans la commande ou le fichier d’en-tête de classe de la table :
// OLE DB Template version:
HRESULT OpenRowset(DBPROPSET *pPropSet = NULL)
{
HRESULT hr = Open(m_session, NULL, pPropSet);
#ifdef _DEBUG
if(FAILED(hr))
AtlTraceErrorRecords(hr);
#endif
return hr;
}
Les attributs implémentent cette méthode différemment. Cette version prend un objet de session et une chaîne de commande qui est définie par défaut la chaîne de commande spécifiée dans db_command, bien que vous puissiez en passer une différente. Si vous définissez une méthode HasBookmark
, le code OpenRowset
définit la propriété DBPROP_IRowsetLocate
. Faites-le seulement si votre fournisseur prend en charge cette propriété.
// Attribute-injected version:
HRESULT OpenRowset(const CSession& session, LPCWSTR szCommand=NULL)
{
DBPROPSET *pPropSet = NULL;
CDBPropSet propset(DBPROPSET_ROWSET);
__if_exists(HasBookmark)
{
propset.AddProperty(DBPROP_IRowsetLocate, true);
pPropSet= &propset;
}
...
}
GetRowsetProperties
void GetRowsetProperties(CDBPropSet* pPropSet);
Cette méthode récupère un pointeur pour l’ensemble de propriétés de l’ensemble de lignes. Vous pouvez utiliser ce pointeur pour définir des propriétés telles que DBPROP_IRowsetChange
. GetRowsetProperties
est utilisé comme suit dans la classe d’enregistrement utilisateur. Vous pouvez modifier ce code pour définir les propriétés de l’ensemble de lignes supplémentaires :
void GetRowsetProperties(CDBPropSet* pPropSet)
{
pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
pPropSet->AddProperty(DBPROP_IRowsetChange, true, DBPROPOPTIONS_OPTIONAL);
pPropSet->AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
}
Notes
Vous ne devez pas définir une méthode GetRowsetProperties
globale, car elle pourrait créer un conflit avec celle définie par l’Assistant. Il s’agit d’une méthode générée par l’Assistant que vous obtenez avec les projets basés sur des modèles et avec attributs. Les attributs n’injectent pas ce code.
OpenDataSource et CloseDataSource
HRESULT OpenDataSource();
void CloseDataSource();
Notes
L’Assistant définit les méthodes OpenDataSource
et CloseDataSource
. OpenDataSource
appelle CDataSource::OpenFromInitializationString.