Fehler „80040e21“ beim Microsoft OLE DB-Anbieter für ODBC-Treiber. Ein mehrstufiger OLE DB-Vorgang hat einen Fehler erzeugt. Überprüfen Sie nach Möglichkeit jeden OLE DB-Statuswert. Es wird keine Arbeit geleistet. Bei einem Website-Programm ist beim Hinzufügen von Nachrichten ein Fehler aufgetreten
Es folgt die Fehlermeldung:
Fehler „80040e21“ beim Microsoft OLE DB-Anbieter für ODBC-Treiber
Der mehrstufige OLE DB-Vorgang erzeugt Fehler. Überprüfen Sie nach Möglichkeit jeden OLE DB-Statuswert. Es wird keine Arbeit geleistet.
Der Grund für diesen Fehler ist, dass ich die Zugriffsverbindungszeichenfolge in Driver={Microsoft Access Driver ()};dbq= & Server.Mappath(DbPath) geändert habe, während die ursprüngliche Verbindungszeichenfolge Provier=Microsoft.Jet.OLEDB .4.0; war. Datenquelle= & Server.Mappath(DbPath), dieser Fehler wird nicht auftreten. Es scheint, dass es zwischen diesen beiden Möglichkeiten der Verbindung zur Access-Datenbank einige Unterschiede gibt. Zumindest die letztgenannte Verbindungsmethode ist hinsichtlich der Fehlertoleranz besser, hinsichtlich der Spezifikationen ist sie jedoch offensichtlich weniger formal.
Der Einfachheit halber bezeichne ich diese beiden Methoden im Folgenden als Provider-Verbindung und Treiber-Verbindung.
Der obige Fehler tritt beim Ändern der Nachrichten nicht auf. Ich habe mir den Code angesehen und festgestellt, dass beim Hinzufügen ein mit Excute erhaltener Datensatz nicht geschlossen wurde. Ich habe es ausgeschaltet und konnte es nicht richtig zum Laufen bringen.
Also habe ich einen Code geschrieben und eine einfache Tabelle entworfen. Ich habe festgestellt, dass zu diesem Zeitpunkt zwei Verbindungsmethoden hinzugefügt werden können, also habe ich die Tabelle in diesem Code wieder auf die ursprüngliche geändert, sie konnte jedoch immer noch nicht ausgeführt werden. Hängt es mit der Uhr zusammen?
Also begann ich, das Formular sorgfältig zu studieren und stellte fest, dass das ursprüngliche Formular ein automatisches Zahlenfeld hatte, dem im Programm ein Wert zugewiesen wurde. Ich erinnere mich, dass automatischen Zahlen keine Werte zugewiesen werden können. Deshalb habe ich die automatische Nummerierung dieser Tabelle entfernt und das Ergebnis war, dass sie normal ausgeführt werden konnte.
Es scheint möglich zu sein, dem automatischen Nummerierungsfeld Werte zuzuweisen, indem eine Verbindung im Provider-Modus hergestellt wird.
Lassen Sie uns an anderer Stelle über den Unterschied sprechen.
Als ich den Treiber zum Herstellen einer Verbindung verwendete, erschien während der Kanaleinstellung ein Nullwert, aber es gab tatsächlich einen Wert in der Datenbank. Ich habe mir den Datentyp dieses Felds angesehen und es war ein Kommentar. Bedeutet das, dass die Unterstützung des Treibers für lange Notizen nicht sehr gut ist? Nein, der Nachrichteninhalt in meiner Nachrichtentabelle muss Notizen sein. Dies sollte nicht der Grund sein.
Was ist der Grund? Liegt es daran, dass er hinter einer anderen Notiz steckt? Es gibt jedoch auch zwei Notizen in der Nachrichtentabelle, und die Inhaltsnotizen befinden sich ebenfalls hinter den Einleitungsnotizen. Auch dieser Verdacht wurde ausgeräumt.
Liegt es daran, dass dieses Feld Schlüsselwörter enthält? Ich habe den Wert dieses Feldes auf 1 geändert, aber das Ergebnis war ebenfalls falsch.
Was ist der Grund?
Schreiben Sie einfach selbst einen weiteren Seitentest. Der Testcode lautet wie folgt
Das Folgende ist der Testcode:
Kopieren Sie den Codecode wie folgt:
schwacher Anschluss
set conn=server.createobject(adodb.recordset)
conn.open drivers={Microsoft Access Driver (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'Treiberverbindungsmethode
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'Anbieterverbindungsmethode
set rs=conn.execute(select * from s_channel where channelID=11)
Antwort.Write rs(UploadSetting)
rs.close
setrs=nichts
Wenn festgestellt wird, dass beide Verbindungen normal ausgegeben werden können.
Also habe ich (response.write) im Originalcode dort ausgegeben, wo der Datensatz gerade geöffnet wurde, und festgestellt, dass der Wert des Felds an dieser Stelle normal ausgegeben werden konnte. Also habe ich den Ausgabecode weiter nach unten verschoben und ihn schließlich nach verschoben
Hier ist der Codeausschnitt:
Kopieren Sie den Codecode wie folgt:
if IsNull(rs(UploadSetting)) oder rs(UploadSetting)= then
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,@)
anders
UploadSetting=Split(rs(UploadSetting),@)
Ende wenn
Wenn es über if platziert wird, kann der Inhalt normal ausgegeben werden, aber warum wird Null ausgegeben, wenn es hinter else platziert wird?
Der endgültige Testcode lautet also wie folgt
Das Folgende ist der Testcode:
Kopieren Sie den Codecode wie folgt:
schwacher Anschluss
set conn=server.createobject(adodb.recordset)
conn.open drivers={Microsoft Access Driver (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'Treiberverbindungsmethode
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'Anbieterverbindungsmethode
set rs=conn.execute(select * from s_channel where channelID=11)
Antwort.Write rs(UploadSetting)
if IsNull(Rs(UploadSetting)) oder rs(UploadSetting)= then
Antwort. Schreiben Sie dd
anders
Antwort.Write rs(UploadSetting)
Ende wenn
rs.close
setrs=nichts
Der obige Code kann den Wert in rs(uploadSetting) korrekt ausgeben, wenn eine Verbindung im Provider-Modus besteht, im Treibermodus jedoch nichts.
Können wir das verstehen: Im Treibermodus kann der Kommentarinhalt nur einmal referenziert werden und wird beim erneuten Referenzieren zu einem NULL-Wert. Dies wird beim Provider nicht passieren.
Um uns an diese Situation anzupassen, können wir nur eine Variable übergeben. Lassen Sie den Inhalt des Memofelds zunächst einer Variablen übergeben, anstatt ihn direkt in Anführungszeichen zu setzen.