Modification de lignes avec des opérations positionnées
Les curseurs pouvant être mis à jour prennent en charge les instructions de modification des données qui permettent de mettre à jour les lignes à l'aide d'un curseur. Lorsque vous êtes positionné sur une ligne d'un curseur pouvant être mis à jour, vous pouvez procéder à la mise à jour ou à la suppression des lignes de la table de base servant à créer la ligne actuelle dans le curseur. Ces mises à jour sont dites « positionnées ».
Les mises à jour positionnées sont effectuées sur la même connexion que celle ayant servi à l'ouverture du curseur. Ceci permet aux modifications de données de partager le même espace de transaction que le curseur et évite que les mises à jour soient bloquées par des verrous maintenus par le curseur.
Deux méthodes permettent d'effectuer des mises à jour positionnées dans un curseur :
la clause Transact-SQL WHERE CURRENT OF d'une instruction UPDATE ou DELETE ;
une fonction ou une méthode de mise à jour positionnée d'API de base de données, telle que la fonction ODBC SQLSetPos.
Réalisation de mises à jour positionnées à l'aide de Transact-SQL
La clause Transact-SQL WHERE CURRENT OF est généralement utilisée dans les procédures stockées Transact-SQL, les déclencheurs et les scripts lorsqu'il est nécessaire d'apporter des modifications à certaines lignes d'un curseur. La procédure stockée, le déclencheur ou le script procède aux opérations suivantes :
Il utilise les instructions DECLARE et OPEN pour respectivement déclarer et ouvrir un curseur.
Il utilise les instructions FETCH pour vous positionner dans une ligne du curseur.
Il exécute une instruction UPDATE ou DELETE à l'aide d'une clause WHERE CURRENT OF. Utilisez l'argument cursor_name de l'instruction DECLARE en tant que cursor_name dans la clause WHERE CURRENT OF.
Mises à jour positionnées à l'aide d'une API
Les curseurs créés à l'aide des fonctions et méthodes OLE DB et ADO ne sont pas utilisés dans les clauses WHERE CURRENT OF car ils n'ont pas de noms. ODBC permet cependant à un curseur de serveur d'API d'obtenir un nom à l'aide de la fonction SQLGetCursorName. Après avoir défini les attributs du curseur et ouvert celui-ci en exécutant une instruction Transact-SQL, utilisez la fonction SQLGetCursorName pour obtenir un nom du curseur. Après vous être positionné dans le curseur, exécutez une instruction UPDATE ou DELETE contenant la clause WHERE CURRENT OF référençant le nom retourné par SQLGetCursorName. Cette méthode n'est toutefois pas recommandée. Il est préférable d'utiliser les fonctions de mise à jour positionnée de l'API ODBC.
Les API de bases de données prennent en charge deux méthodes différentes pour effectuer des opérations positionnées sur les curseurs de serveur des API. La première est prise en charge par OBDC, la seconde par OLE DB et ADO.
Dans ODBC, liez les colonnes du curseur aux variables de programme, puis positionnez-vous sur une ligne spécifique du curseur. Si vous voulez effectuer une mise à jour positionnée, remplacez les valeurs des données contenues dans les variables du programme par de nouvelles valeurs. Appelez la fonction SQLSetPos pour procéder à la mise à jour positionnée.
Cette fonction est assortie des options suivantes :
SQLSetPos(SQL_POSITION)
ODBC uniquement. Positionne le curseur ODBC dans une ligne spécifique de l'ensemble de lignes courant.SQLSetPos(SQL_REFRESH)
Actualise les variables de programme liées aux colonnes de l'ensemble de résultats à l'aide des valeurs provenant de la ligne sur laquelle le curseur est actuellement positionné.SQLSetPos(SQL_UPDATE)
Met à jour la ligne courante du curseur à l'aide des valeurs stockées dans les variables de programme liées aux colonnes de l'ensemble de résultats.SQLSetPos(SQL_DELETE)
Supprime la ligne en cours du curseur.
OLE DB et ADO utilisent un modèle différent pour prendre en charge les mises à jour positionnées.
Dans OLE DB, une fois positionné sur une ligne de l'ensemble de lignes, appelez la méthode IRowsetChange::SetData ou IRowsetChange::DeleteRows pour effectuer des mises à jour positionnées. Si le fournisseur OLE DB prend en charge IRowsetUpdate::Update, les modifications effectuées à l'aide des méthodes IRowsetChange sont mises en mémoire cache jusqu'à ce que vous appeliez IRowsetUpdate::Update. Si le fournisseur OLE DB ne prend pas en charge IRowsetUpdate::Update, les modifications effectuées à l'aide des méthodes IRowsetChange sont immédiatement validées.
Dans ADO, une fois positionné sur une ligne de l'ensemble d'enregistrements, appelez les méthodes Update ou Delete de l'objet Recordset pour effectuer des mises à jour positionnées. Si le fournisseur OLE DB prend en charge la méthode IRowsetUpdate::Update, les modifications apportées avec les méthodes Update ou Delete de l'objet Recordset sont mises en mémoire cache jusqu'à ce que vous appeliez la méthode UpdateBatch de l'objet Recordset. Si le fournisseur OLE DB ne prend pas en charge IRowsetUpdate::Update, les modifications effectuées à l'aide des méthodes Update ou Delete de l'objet Recordset sont immédiatement validées.