martes, 29 de diciembre de 2009

Error de ADO: 'No se puede encontrar la fila para su actualizacuón: algunos valores han cambiado desde la última vez que se leyó'

Aquest error es pot produir per diversos motius, per fer un update d'una fila mentre tens un query obert sobre la mateixa taula o fent modificacions amb triggers que modifiquin la mateixa taula, però el cas més extrany és el que ens pertoca. També es podrueix quan tens un trigger i dins d'aquest es realitza un SELECT, si aquesta instrucció no retorna cap valor MSSQL genera un error intern. No hi hauria cap problema si ADO no interpretés l'error intern com un error greu. De fet, surt el següent missatge d'error:





Per solucionar aquest tipus d'error, hem d'afegir al trigger el següent codi SET NOCOUNT ON a l'inici i SET NOCOUNT OFF al final. Llavors el codi quedaria de la següent forma:

CREATE TRIGGER [dbo].[XXXXX] ON [dbo].[Taula1]
FOR INSERT
AS
BEGIN
IF (SELECT COUNT(*) FROM INSERTED) > 0
BEGIN
SET NOCOUNT ON
INSERT INTO Taula2(
Camp1,
Camp2,
Camp3 )
SELECT
ins.Camp1,
ins.Camp3,
ins.Camp4
FROM INSERTED ins
WHERE (ins.Camp2 <> 'S')
AND (ISNULL(ins.Camp6, 0) > 0.001)
SET NOCOUNT OFF
END
END