JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Excepción con 'ARITHABORT' al insertar datos en una base de datos SQL Server

Este error me pasó el otro día en una aplicación que estoy desarrollando para una empresa de logística y me pareció lo suficientemente interesante como para reseñarlo aquí.

El caso es que tienes un código de actualización INSERT normal y corriente de acceso a datos, escrito directamente con código ADO.NET, a través de un procedimiento almacenado o incluso mediante el uso de un TableAdapter de un DataSet tipado (por debajo es ADO.NET normal). Cuando vas a actualziar cualquier registro, de repente, te salta el siguiente error:

INSERT failed because the following SET options have incorrect settings: 'ARITHABORT'

Bueno. Esta excepción es el resultado resultado directo de una particularidad de SQL Server. El caso es que si tenemos una tabla que está referenciada dentro de cualquier vista de la base de datos que sea una vista indexada, no es posible introducir nuevos registros en la tabla de la manera normal y directa.

Lo típico que pasa (y de hecho fué lo que me pasó a mi): Creas varias tablas, las usas, trabajas con ellas por código etc... y todo funciona a la perfección. Cuando la aplicación ya está bastante avanzada te dices: "Vale, voy a pasar el analizador de consultas a ver qué me sugiere para mejorar el rendimiento de lo que se hace en la base de datos" (en este aplicación en concreto hay consultas bastante complejas). Pasas el analizador y te sugiere algún que otro índice, estadísticas y, a veces, también alguna vista. Aceptas las sugerencias y dejas que se hagan los cambios. Pruebas de nuevo la aplicación y ¡hop!, el maldito error reseñado arriba.

Normalmente es porque se hac creado de manera consicente o inconsciente una vista indexada que referencia a alguans tablas que ahora ya no se pueden actualziar directamente.

Una solución es evitar el uso de este tipo de vistas (la mayor parte de las veces puedes vivir sin ellas).

La solución real al problema consiste en establecer la opción:

SET ARITHABORT ON

para que se ejecute dentro del mismo conjunto de instrucciones enviadas a la base de datos (a través de la misma conexión y antes de nada). Esto permite que el INSERT en la tabla problemática tenga éxito a pesar de la vista indexada.

El códig ADO.NET que debes usar para conseguirlo es, nada más abrir la conexión  y antes de hacer la inserción el siguiente:

miConn.Execute "SET ARITHABORT ON"

Yo en mi aplicación, como no soy un experto en bases de datos y ni siquiera me gustan mucho, opté por cargarme la vista indexada ;-)

Espero que esto arroje luz y le ahorre tiempo a más de uno.

José Manuel Alarcón
Banner

Comentarios (4) -

Una pregunta, cómo se puede hacer que el Analizador de Consultas te sugiera mejoras en el rendimiento ??

Saludos.

Responder

En SQL Server 2000 lo tienes en el menú Consulta>Asistente para optimización de índices

En SQL Server 2005 está mucho mejor y lo tienes en Tools.

Saludos

Responder

No será amigo.. que debes trabajar siempre con procedimientos almacenados y setear en los proc. alm. las configuraciones necesarias... ??? yo utilizo siempre acceso a procedimientos almacenados, es una cuestión de "principios".... en mis clases digo como chiste... no damos servicios de tablas... eso lo dan las barracas... je..je. nosotros con sql damos servicios de datos....

slds.
rolando

Responder

En realidad amigo... hay muchas ocasiones en las que no puedes trabajar con procedimientos almacenados porque tienes que independizar al máximo tu aplicaicón del gestor de datos. Por otra parte en los procedimientos almacenados pasa exactamente lo mismo: si no sabes nada de SET ARITHABORT la aplicación fallará igual.
Tampoco sé como se comportaría esta opción establecida dentro de un proc. alm. si éste forma parte de una transacción junto con otros proc. alm. que también ajustan lo mismo. Pero esto ya es ignorancia mia...

Responder

Agregar comentario