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.