Partager via


Mises à jour positionnées (ODBC)

ODBC prend en charge deux méthodes permettant d'effectuer des mises à jour positionnées dans un curseur :

  • SQLSetPos

  • Clause WHERE CURRENT OF

L'approche la plus commune consiste à utiliser SQLSetPos. Les options suivantes sont disponibles :

  • SQL_POSITION
    Positionne le curseur sur une ligne spécifique dans l'ensemble de lignes actif.

  • SQL_REFRESH
    Actualise les variables de programme liées aux colonnes de jeu de résultats avec les valeurs provenant de la ligne sur laquelle le curseur est actuellement positionné.

  • SQL_UPDATE
    Met à jour la ligne active du curseur avec les valeurs stockées dans les variables de programme liées aux colonnes de jeu de résultats.

  • SQL_DELETE
    Supprime la ligne active du curseur.

SQLSetPos peut être utilisé avec tout jeu de résultats d'instruction lorsque les attributs du curseur du descripteur d'instruction sont définis pour utiliser des curseurs côté serveur. Les colonnes de jeu de résultats doivent être liées à des variables de programme. Dès que l'application a extrait une ligne, elle appelle SQLSetPos(SQL_POSTION) pour positionner le curseur sur cette ligne. L'application peut ensuite appeler SQLSetPos(SQL_DELETE) pour supprimer la ligne active, ou elle peut déplacer les nouvelles valeurs de données dans les variables de programme liées et appeler SQLSetPos(SQL_UPDATE) pour mettre à jour la ligne active.

Les applications peuvent mettre à jour ou supprimer toute ligne de l'ensemble de lignes avec SQLSetPos. Appeler SQLSetPos constitue une alternative commode à la construction et l'exécution d'une instruction SQL. SQLSetPos opère sur l'ensemble de lignes actif et ne peut être utilisé qu'après un appel à SQLFetchScroll.

La taille de l'ensemble de lignes est définie par un appel à SQLSetStmtAttr avec l'argument d'attribut SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos utilise une nouvelle taille d'ensemble de lignes, mais uniquement après un appel à SQLFetch ou SQLFetchScroll. Par exemple, si la taille de l'ensemble de lignes est modifiée, SQLSetPos est appelé, puis SQLFetch ou SQLFetchScroll est appelé. L'appel à SQLSetPos utilise l'ancienne taille d'ensemble de lignes, tandis que SQLFetch ou SQLFetchScroll utilise la nouvelle taille d'ensemble de lignes.

La première ligne de l'ensemble de lignes porte le numéro 1. L'argument RowNumber de SQLSetPos doit identifier une ligne de l'ensemble de lignes ; autrement dit sa valeur doit se trouver dans la plage comprise entre 1 et le nombre de lignes qui ont été extraites le plus récemment. Cette valeur peut être inférieure à la taille de l'ensemble de lignes. Si RowNumber a la valeur 0, l'opération s'applique à chaque ligne de l'ensemble de lignes.

L'opération de suppression de SQLSetPos amène la source de données à supprimer une ou plusieurs lignes sélectionnées d'une table. Pour supprimer des lignes avec SQLSetPos, l'application appelle SQLSetPos avec Operation défini sur SQL_DELETE et RowNumber défini sur le numéro de la ligne à supprimer. Si RowNumber a la valeur 0, toutes les lignes de l'ensemble de lignes sont supprimées.

Une fois SQLSetPos exécuté, la ligne supprimée est la ligne active et son statut est SQL_ROW_DELETED. Cette ligne ne peut pas être utilisée dans des opérations positionnées supplémentaires, telles que les appels à SQLGetData ou SQLSetPos.

Lorsque vous supprimez toutes les lignes de l'ensemble de lignes (RowNumber est égal à 0), l'application peut empêcher le pilote de supprimer certaines lignes en utilisant le tableau d'opération de ligne comme pour l'opération de mise à jour de SQLSetPos.

Chaque ligne supprimée doit être une ligne qui existe dans le jeu de résultats. Si les mémoires tampons de l'application ont été remplies par extraction et si un tableau de statut de ligne a été maintenu, ses valeurs à chacune de ces positions de ligne ne doivent pas être SQL_ROW_DELETED, SQL_ROW_ERROR ou SQL_ROW_NOROW.

Les mises à jour positionnées peuvent également être réalisées à l'aide de la clause WHERE CURRENT OF sur les instructions UPDATE, DELETE et INSERT. WHERE CURRENT OF requiert un nom de curseur qu'ODBC génère lorsque la fonction SQLGetCursorName est appelée, ou que vous pouvez spécifier en appelant SQLSetCursorName. La procédure générale suivante est utilisée pour effectuer une mise à jour de WHERE CURRENT OF dans une application ODBC :

  • Appelez SQLSetCursorName pour établir un nom de curseur pour le descripteur d'instruction.

  • Générez une instruction SELECT avec une clause FOR UPDATE OF et exécutez-la.

  • Appelez SQLFetchScroll pour extraire un ensemble de lignes ou SQLFetch pour extraire une ligne.

  • Appelez SQLSetPos (SQL_POSITION) pour positionner le curseur sur la ligne.

  • Générez et exécutez une instruction UPDATE avec une clause WHERE CURRENT OF en utilisant le nom de curseur défini avec SQLSetCursorName.

Vous pouvez également appeler SQLGetCursorName après avoir exécuté l'instruction SELECT au lieu d'appeler SQLSetCursorName avant d'exécuter l'instruction SELECT. SQLGetCursorName retourne un nom de curseur par défaut affecté par ODBC si vous ne définissez pas un nom de curseur à l'aide de SQLSetCursorName.

SQLSetPos est préférable à WHERE CURRENT OF lorsque vous utilisez des curseurs côté serveur. Si vous utilisez un curseur statique pouvant être mis à jour avec la bibliothèque de curseurs ODBC, la bibliothèque de curseurs implémente les mises à jour WHERE CURRENT OF en ajoutant une clause WHERE avec les valeurs de clé pour la table sous-jacente. Cela peut entraîner des mises à jour inattendues si les clés de la table ne sont pas uniques.