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.

💪🏻 驴Este post te ha ayudado?, 驴has aprendido algo nuevo?
Pues NO te pido que me invites a un caf茅... Te pido algo m谩s f谩cil y mucho mejor