PROBLÈME : erreur 80020009 lors de la récupération de données à partir de SQL


Symptômes


L’erreur suivante se produit lors de l’accès à un Recordset dans un fichier ASP (Active Server Pages) qui contient « Text » ou « BLOB » dans un tableau SQL :
Erreur « 80020009 » du fournisseur Microsoft OLE DB pour les pilotes ODBC

Cause


La condition suivante risque de provoquer l’apparition de l’erreur :
Les champs texte/BLOB sont sélectionnés dans un ordre antérieur aux autres types de champs.

Résolution


Lorsque vous travaillez avec des champs BLOB à partir de Microsoft SQL Server, vous devez les placer à droite des colonnes non BLOB dans le jeu de résultats. Pour être sûr, vous devez également lire les colonnes de gauche à droite, par conséquent, si vous avez deux colonnes BLOB comme deux dernières colonnes dans votre ResultSet, lisez la première et la deuxième. Ne les lisez pas dans l’ordre inverse. Pour montrer l’ordre correct de la sélection de champs, créez une nouvelle page ASP dans un projet Visual InterDev et collez le code suivant dans la page ASP vide. Modification de la chaîne de connexion pour vous connecter à votre serveur SQL Server :Remarque vous devez modifier le nom d’utilisateur =<nom d’utilisateur> et PWD =<mot de passe fort> les valeurs correctes avant d’exécuter ce code. Assurez-vous que l’ID d’utilisateur possède les autorisations appropriées pour effectuer cette opération sur la base de données.
   <%@ Language=VBScript %>   <HTML>   <BODY bgcolor=white>   <%      Set cn = Server.CreateObject("ADODB.Connection")      Set rs = Server.CreateObject("ADODB.Recordset")      'Open the connection.      cn.Open "dsn=yoursystemdsn;Username=<username>;PWD=<strong password>;database=pubs;"      'Open the recordset.      'Notice that the Blob field, pr_info, is last in the field order.      rs.Open "select pub_id, pr_info from pub_info", cn      While Not rs.EOF         Response.Write "<P>PR Info:<P>" & rs("pr_info")         Response.Write "<P>That was the PR Info for PubID " &                           rs("pub_id")         rs.MoveNext      Wend   %>   </BODY>   </HTML>

Statut


Ce comportement est inhérent au produit. Toutefois, cela ne se produit pas lors de l’utilisation de MDAC 2.1 SP2 ou version ultérieure avec le pilote 3,7 ou version ultérieure pour SQL Server. vous pouvez télécharger la dernière version des composants Microsoft Data Access à partir du site Web Microsoft suivant :

Informations supplémentaires


SQL Server envoie les données sur le réseau et le client reçoit essentiellement un flux de bits lu séquentiellement sur le réseau réseau. Avec les colonnes dépendantes (autrement dit, les valeurs peuvent être copiées dans des tampons de mémoire locales et mises en cache), le pilote transfère les données de ces colonnes vers des mémoires tampons de mémoire. Une fois les données dans les mémoires tampons locales, vous pouvez les lire dans n’importe quel ordre. Par conséquent, vous pouvez lire les colonnes de résultats dans n’importe quel ordre lorsque toutes les colonnes sont liées (et non des objets BLOB). Lorsque vous incluez des colonnes BLOB, la longueur de la colonne peut être approximativement de 2 giga-octets et des bibliothèques d’accès aux données n’associent généralement pas ces colonnes, car le pilote ne peut pas déterminer exactement la taille de l’objet BLOB jusqu’à ce qu’il soit récupéré. De plus, les bibliothèques d’accès aux données évitent généralement de mettre en cache les données BLOB dans la mesure où cela peut consommer de grandes quantités de mémoire et être mises en cache dans la bibliothèque d’accès aux données et que votre application n’est pas efficace. Si le pilote d’accès aux données est requis pour renvoyer le contenu d’une colonne BLOB, il supprime généralement les colonnes non liées qui précèdent la colonne de BLOB demandée, car il doit récupérer le flux de données séquentielles avant de pouvoir lire la colonne demandée. Par conséquent, il est plus efficace de lire vos ResultSet de gauche à droite, car cela correspond à la façon dont les données sont récupérées. Notez que ceci décrit le comportement de SQL Server. Les SGBD d’Oracle et de client/serveur pourront faire la même chose, mais ce n’est pas obligatoire. Il est possible que vous n’ayez pas à utiliser une colonne de texte. Dans la mesure où SQL Server alloue de l’espace au sein de blocs 2K, l’utilisation de colonnes de texte peut entraîner une utilisation inefficace du stockage si la longueur du texte est faible. Le temps de sauvegarde est également affecté, car le vidage du journal des transactions prend plus de temps. Il est souvent préférable de créer une autre table qui contient le PK de votre table existante, une colonne de numéro de segment et une colonne varchar (255). Divisez le texte en nombre de caractères 255 requis et insérez autant de lignes dans la nouvelle table qu’il y a de blocs. En règle générale, il vaut mieux que le temps de programmation supplémentaire, car une utilisation plus efficace du stockage et des sauvegardes s’effectue plus rapidement.