Buscar en Google este mensaje de error ADO indica que se encuentra comúnmente en el desarrollo ASP.NET, pero no he encontrado mucha mención de cuándo ocurre en las aplicaciones Delphi. Tenemos algunos sitios de clientes que experimentan problemas transitorios de red, y este es el mensaje de error sintomático. Podemos duplicarlo en pruebas de oficina fácilmente; Simplemente cerrar un servicio MS SQL Server, mientras que su objeto TADOConnection Delphi está conectado a una base de datos en esa instancia del servidor y se obtiene esta excepción: (¿o usted)Recuperación automática cuando DBNETLIB ConnectionWrite Error de red general hace que las conexiones ADO se desconecten en las aplicaciones Delphi?
[DBNETLIB][ConnectionWrite (send()).]General network error. Check your network documentation.
Sí, la captura de esta excepción, y sabes que este error ha ocurrido. Excepto que se trata de una aplicación de 800 KLOC + con más de 10.000 bloques de prueba-excepto en las acciones de la base de datos, cualquiera de los cuales podría fallar con este error.
TADOConnection
tiene algunos eventos de error, ninguno de los cuales se dispara en este caso. Sin embargo, la conexión ADO en sí tiene una falla una vez que esto ocurre, incluso si reinicia la base de datos SQL, TDOConnection.Connected sigue siendo cierto, pero le está mintiendo. Realmente está en un estado de falla.
Así pues, mi pregunta es:
¿Se puede detectar este estado de fallo, y recuperarse de ella, de cualquier manera que es menos trabajo que va en 10.000 individuo try-excepto los bloques y el establecimiento de alguna mundial "volver a conectar la variable global ADO"?
Espero que haya una manera de entrar en TADOConnection.ConnectionObject (el objeto OLEDB COM ADO bruto subyacente) y detectar esta condición de error cuando estamos comenzando una nueva consulta, para que podamos restablecer la ADOConnection y continuar la próxima vez que ejecutemos una consulta. Dado que nuestro código está organizado de una manera que nos permitiría detectar esto "después de la falla" mucho más fácilmente de lo que nos permitiría hacerlo de la manera en que lo haría en una aplicación de demostración de 10 líneas.
This other SO question se pregunta por qué sucede, es decir no lo que estoy pidiendo, por favor no me dan respuestas "prevención", que sé de ellos ya, estoy buscando para una recuperación y detección-de- técnica de conexión ADO detenida, salvo capturar las excepciones. De hecho, este es un buen ejemplo de excepciones que salieron mal; ADO es un objeto schrodingers-cat en este modo de falla.
Conozco los artículos de MS Knowledgebase y las diversas soluciones que flotan en Internet. Pregunto acerca de RECUPERACIÓN sin perder los datos de los clientes, una vez que la condición de error (que a menudo es transitoria en nuestra situación) ha desaparecido. Eso significa que congelamos nuestra aplicación, mostramos la excepción al cliente y, cuando el cliente hace clic en Reintentar o Continuar, intentamos reparar y continuar. tenga en cuenta que nuestro código actual tiene un millón de código try-except-log-and-continue, que se interpondrá en nuestro camino, por lo que espero que alguien responda que un manejador de aplicaciones para excepciones no controladas es la mejor manera, pero lamentablemente no podemos usarlo Realmente espero sin embargo que sea posible detectar un objeto de conexión ADO congelado/fallado/muerto.
Esto es lo que tengo:
try
if fQueryEnable and ADOConnection1.Connected then begin
qQueryTest1.Active := false;
qQueryTest1.Active := true;
Inc(FQryCounter);
Label2.Caption := IntToStr(qQueryTest1.RecordCount)+' records';
end;
except
on E:Exception do begin
fQueryEnable := false;
Memo1.Lines.Add(E.ClassName+' '+E.Message);
if E is EOleException and Pos('DBNETLIB',E.Message)>0 then begin
ADOConnectionFaulted := boolean; { Global variable. }
end;
raise;
end;
end;
El problema con la solución anterior es que tengo que copiar y pegar unos 10.000 lugares en mi solicitud.
Algo así como un TTimer y una simple consulta como SELECT @@ VERSION y variable de estado global? – whosrdaddy
Nunca tuve que enfrentar este problema ya que he creado un contenedor para todas mis aplicaciones que manejan este tipo de situaciones. Un poco apesta si necesitas cambiar 10k ubicaciones :(. – whosrdaddy
Sí, un "perro guardián ADO". Y otro malvado TTimer. :-) –