Fournisseur Microsoft OLE DB pour les pilotes ODBC Erreur « 80040e21 » Une opération OLE DB en plusieurs étapes a généré une erreur. Si possible, vérifiez chaque valeur d'état OLE DB. Aucun travail n'est effectué. Un programme de site Web, une erreur s'est produite lors de l'ajout d'actualités
Voici le message d'erreur :
Erreur du fournisseur Microsoft OLE DB pour les pilotes ODBC « 80040e21 »
L’opération OLE DB en plusieurs étapes génère des erreurs. Si possible, vérifiez chaque valeur d'état OLE DB. Aucun travail n'est effectué.
La raison de cette erreur est que j'ai modifié la chaîne de connexion d'accès en Driver={Micorsoft Access Driver ()};dbq= & Server.Mappath(DbPath), alors que la chaîne de connexion d'origine était Provier=Microsoft.Jet.OLEDB .4.0; Source de données = & Server.Mappath(DbPath), cette erreur ne se produira pas. Il semble qu'il existe quelques différences entre ces deux manières de se connecter à la base de données Access. Au moins cette dernière méthode de connexion est meilleure en termes de tolérance aux pannes, mais elle est évidemment moins formelle en termes de spécifications.
Par souci de simplicité, j'appellerai ci-dessous ces deux méthodes connexion au fournisseur et connexion au pilote.
L'erreur ci-dessus n'apparaît pas lors de la modification de l'actualité. J'ai regardé le code et j'ai constaté que lors de l'ajout, un jeu d'enregistrements obtenu avec Excute n'était pas fermé. Je l'ai éteint et je n'ai pas réussi à le faire fonctionner correctement.
J'ai donc écrit un morceau de code et conçu un tableau simple. J'ai découvert que deux méthodes de connexion pouvaient être ajoutées à ce moment-là, j'ai donc remplacé le tableau de ce code par celui d'origine, mais il n'a toujours pas pu être exécuté. Est-ce lié à la montre ?
J'ai donc commencé à étudier attentivement le formulaire et j'ai découvert que le formulaire original comportait un champ numérique automatique auquel une valeur était attribuée dans le programme. Je me souviens que les numéros automatiques ne peuvent pas se voir attribuer de valeurs. J'ai donc supprimé la numérotation automatique de cette table, et le résultat a été qu'elle a pu être exécutée normalement.
Il semble qu'il soit possible d'attribuer des valeurs au champ de numérotation automatique en se connectant en mode Fournisseur.
Parlons de la différence dans un autre endroit.
Lorsque j'ai utilisé le pilote pour me connecter, une valeur Null est apparue lors du réglage du canal, mais elle avait en fait une valeur dans la base de données. J'ai regardé le type de données de ce champ et c'était un commentaire. Cela signifie-t-il que la prise en charge des notes longues par le conducteur n'est pas très bonne ? Non, le contenu des actualités dans mon tableau d'actualités doit être constitué de notes. Cela ne devrait pas être la raison.
Quelle est la raison ? Est-ce parce qu'il est derrière une autre note ? Cependant, il y a également deux notes dans le tableau des actualités, et les notes de contenu sont également situées derrière les notes d'introduction. Ce soupçon a également été éliminé.
Est-ce parce que ce champ contient des mots-clés ? J'ai changé la valeur de ce champ à 1, mais le résultat était également erroné.
Quelle est la raison ?
Écrivez simplement une autre page de test vous-même. Le code du test est le suivant.
Voici le code du test :
Copiez le code comme suit :
faible connexion
définir conn=server.createobject(adodb.recordset)
conn.open driver={Pilote d'accès Microsoft (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'méthode de connexion du pilote
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'méthode de connexion du fournisseur
set rs=conn.execute(select * from s_channel où channelID=11)
réponse.Write rs (UploadSetting)
rs.fermer
setrs = rien
S'il s'avère que les deux connexions peuvent produire normalement.
J'ai donc sorti (response.write) dans le code d'origine où le jeu d'enregistrements venait d'être ouvert, et j'ai découvert que la valeur du champ pouvait être sortie normalement à cet emplacement. J'ai donc continué à déplacer le code de sortie vers le bas, et je l'ai finalement déplacé vers
Voici l'extrait de code :
Copiez le code comme suit :
si IsNull(rs(UploadSetting)) ou rs(UploadSetting)= alors
UploadSetting=Split(1,2,3,4@Other@2@0@jpg|gif|bmp|png@100@1@swf@500@1@rm|mp3|wav|mid|avi|mpg|mpeg| asf|wma@2048@1@rar|zip|exe|doc|xls|chm@2048@1,@)
autre
UploadSetting=Split(rs(UploadSetting),@)
finir si
Lorsqu'il est placé au-dessus de if, le contenu peut être affiché normalement, mais pourquoi Null est-il affiché lorsqu'il est placé après else ?
Le code de test final est donc le suivant
Voici le code du test :
Copiez le code comme suit :
faible connexion
définir conn=server.createobject(adodb.recordset)
conn.open driver={Pilote d'accès Microsoft (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'méthode de connexion du pilote
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'méthode de connexion du fournisseur
set rs=conn.execute(select * from s_channel où channelID=11)
réponse.Write rs (UploadSetting)
si IsNull(Rs(UploadSetting)) ou rs(UploadSetting)= alors
réponse.Écrire jj
autre
réponse.Write rs (UploadSetting)
finir si
rs.fermer
setrs = rien
Le code ci-dessus peut afficher correctement la valeur dans rs(uploadSetting) lorsqu'il est connecté en mode fournisseur, mais ne rien afficher en mode pilote.
Pouvons-nous comprendre cela : en mode Driver, le contenu de la remarque ne peut être référencé qu'une seule fois, et il deviendra une valeur NULL lorsqu'il sera à nouveau référencé. Cela n'arrivera pas avec le fournisseur.
Pour s'adapter à cette situation, on ne peut passer qu'une variable. Laissez le contenu du champ mémo être d'abord attribué à une variable, plutôt que d'être cité directement.