Proveedor Microsoft OLE DB para controladores ODBC Error '80040e21' Una operación OLE DB de varios pasos produjo un error. Si es posible, verifique cada valor de estado de OLE DB. No se hace ningún trabajo. Un programa de sitio web, ocurrió un error al agregar noticias.
El siguiente es el mensaje de error:
Proveedor Microsoft OLE DB para controladores ODBC error '80040e21'
La operación OLE DB de varios pasos genera errores. Si es posible, verifique cada valor de estado de OLE DB. No se hace ningún trabajo.
El motivo de este error es que cambié la cadena de conexión de acceso a Driver={Micorsoft Access Driver ()};dbq= & Server.Mappath(DbPath), mientras que la cadena de conexión original era Provier=Microsoft.Jet.OLEDB .4.0; Fuente de datos = & Server.Mappath (DbPath), este error no ocurrirá. Parece que existen algunas diferencias entre estas dos formas de conectarse a la base de datos de acceso. Al menos el último método de conexión es mejor en términos de tolerancia a fallas, pero obviamente es menos formal en términos de especificaciones.
En aras de la simplicidad, a continuación llamaré a estos dos métodos conexión de proveedor y conexión de controlador.
El error anterior no aparece al modificar la noticia. Miré el código y descubrí que al agregar, un conjunto de registros obtenido con Excute no se cerraba. Lo apagué y no pude hacerlo funcionar correctamente.
Entonces escribí un fragmento de código y diseñé una tabla simple. Descubrí que se podían agregar dos métodos de conexión en este momento, así que cambié la tabla en este código a la original, pero aún no se pudo ejecutar. ¿Está relacionado con el reloj?
Entonces comencé a estudiar el formulario detenidamente y descubrí que el formulario original tenía un campo numérico automático al que se le asignaba un valor en el programa. Recuerdo que a los números automáticos no se les pueden asignar valores. Entonces eliminé la numeración automática de esa tabla y el resultado fue que se podía ejecutar normalmente.
Parece que es posible asignar valores al campo de numeración automática conectándose en modo Proveedor.
Hablemos de la diferencia en otro lugar.
Cuando utilicé el controlador para conectarme, apareció un valor nulo durante la configuración del canal, pero en realidad tenía un valor en la base de datos. Miré el tipo de datos de este campo y era un comentario. ¿Eso significa que el soporte del conductor para notas largas no es muy bueno? No, el contenido de las noticias en mi tabla de noticias deben ser notas. Este no debería ser el motivo.
¿Cuál es la razón? ¿Será porque está detrás de otra nota? Sin embargo, también hay dos notas en la tabla de noticias y las notas de contenido también se encuentran detrás de las notas de introducción. Esta sospecha también fue eliminada.
¿Es porque este campo tiene palabras clave? Cambié el valor de este campo a 1, pero el resultado también fue incorrecto.
¿Cuál es la razón?
Simplemente escriba otra página de prueba usted mismo. El código de prueba es el siguiente.
El siguiente es el código de prueba:
Copie el código de código de la siguiente manera:
conexión tenue
establecer conexión=servidor.createobject(adodb.recordset)
conn.open driver={controlador de acceso de Microsoft (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'método de conexión del controlador
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'método de conexión del proveedor
establecer rs=conn.execute(seleccione * de s_channel donde channelID=11)
respuesta.Escribir rs(UploadSetting)
rs.cerrar
setrs=nada
Si se descubre que ambas conexiones pueden generar salida normalmente.
Así que generé (response.write) en el código original donde se acaba de abrir el conjunto de registros y descubrí que el valor del campo se podía generar normalmente en esa ubicación. Así que seguí moviendo el código de salida hacia abajo y finalmente lo moví a
Aquí está el fragmento de código:
Copie el código de código de la siguiente manera:
si IsNull(rs(UploadSetting)) o rs(UploadSetting)= entonces
UploadSetting=Dividir(1,2,3,4@Otro@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,@)
demás
Configuración de carga=Dividir(rs(Configuración de carga),@)
terminar si
Cuando se coloca arriba de si, el contenido se puede generar normalmente, pero ¿por qué se genera un resultado nulo cuando se coloca después de otra cosa?
Entonces el código de prueba final es el siguiente
El siguiente es el código de prueba:
Copie el código de código de la siguiente manera:
conexión tenue
establecer conexión=servidor.createobject(adodb.recordset)
conn.open driver={controlador de acceso de Microsoft (*.mdb)};dbq= & server.mappath(data/dd.mdb) 'método de conexión del controlador
'conn.open Provider=Microsoft.Jet.OLEDB.4.0;Data Source= & server.mappath(data/dd.mdb) 'método de conexión del proveedor
establecer rs=conn.execute(seleccione * de s_channel donde channelID=11)
respuesta.Escribir rs(UploadSetting)
si IsNull(Rs(UploadSetting)) o rs(UploadSetting)= entonces
respuesta.Escribir dd
demás
respuesta.Escribir rs(UploadSetting)
terminar si
rs.cerrar
setrs=nada
El código anterior puede generar correctamente el valor en rs(uploadSetting) cuando se conecta en modo proveedor, pero no genera nada en modo Controlador.
¿Podemos entender esto? En el modo Controlador, solo se puede hacer referencia al contenido del comentario una vez y se convertirá en un valor NULL cuando se haga referencia nuevamente. Esto no sucederá con el Proveedor.
Para adaptarnos a esta situación, solo podemos pasar una variable. Deje que el contenido del campo memo se proporcione primero a una variable, en lugar de citarlo directamente.