Gracias a cualquiera que pueda ofrecer alguna ayuda ...Fallos recientes sobre Delphi TADOStoredProc/D6 y RAD Studio XE2
Antecedentes:
Tengo una aplicación codificada y sigue siendo compatible con Borland Delphi v6. Hace muy poco tiempo tuve problemas con la clase TADOStoredProc al no poder ejecutar el procedimiento almacenado. Este código previamente había sido estable durante varios años y nunca se había modificado.
Puedo configurar un tiempo de espera en la solicitud, que se respeta, sin embargo, la llamada al procedimiento almacenado nunca se ejecuta, incluso en un tiempo de espera muy largo. La aplicación simplemente se cuelga o se libera de una excepción de tiempo de espera. (Sé que el servidor no está sobrecargado y responde a otras solicitudes SQL SELECT originadas por el mismo cliente).
Sé que D6 es viejo. Tengo un entorno separado con Embarcadero RAD Studio XE2, donde logré construir el mismo proyecto y todavía tengo los mismos problemas. ... Solo por asegurar.
¿Dónde ir?
- Revise el código proporcionado y vea si hay una mejor manera de hacer las cosas. (¿Tal vez la interfaz MSSQL es más exigente, después de una actualización reciente?) Ciertamente acojo las recomendaciones.
- ¿Existe un método alternativo que pueda conectar a la aplicación, que sea confiable y no requiera TADOStoredProc? He hecho mi búsqueda, pero no he encontrado buenos ejemplos.
código de ejemplo
function TImport.OpenHeader(DriverID: Integer, …, ScanStart: DateTime, ...): integer;
var
suid: integer;
jid: integer;
con : TADOConnection;
sp : TADOStoredProc;
begin
suid := getScanUnitID();
jid := deriveJobID(ScanStart);
con := TADOConnection.Create(nil);
con.LoginPrompt := false;
con.ConnectionString := 'Provider=SQLOLEDB.1;Password=<testPwd>;Persist Security Info=True;User ID=<testUser>;Initial Catalog=<myDB>;Data Source=<myServer>';
con.CommandTimeout := 10;
con.KeepConnection := true;
con.Connected := true;
sp := TADOStoredProc.Create(nil);
sp.Connection := con;
sp.CommandTimeout := 10;
sp.ProcedureName := 'mon4_OpenHeader;1';
sp.Parameters.Refresh;
sp.Parameters.ParamByName('@ScanUnitID').Value := suid;
sp.Parameters.ParamByName('@JobID').Value := jid;
sp.Parameters.ParamByName('@DriverID').Value := DriverID;
//[…]
sp.Parameters.ParamByName('@Result').Direction := pdOutput; //returned from stored proc
sp.ExecProc;
Result := sp.Parameters.ParamByName('@Result').Value;
sp.Free;
con.Free;
end; // end OpenHeader(DriverID: Integer, …, ScanStart: DateTime, …): integer
Gracias por cualquier ayuda que puede proporcionar.
¿Hay algún error? ¿Has probado Profiler para saber si se ejecutó el procedimiento? ¿Y has intentado ejecutar el procedimiento desde sms? –
Gracias por la recomendación. Curiosamente, SQL Profiler parecía temblar lo suficiente como para "funcionar" esta vez. Las excepciones de tiempo de ejecución Delphi ADO lanzadas fueron "tiempos de espera". Ejecutando desde SSMS no tuvo problemas. – user1631866
Gracias por la recomendación. | Curiosamente, SQL Profiler parecía temblar lo suficiente como para "funcionar" esta vez. Las excepciones de tiempo de ejecución Delphi ADO lanzadas fueron "tiempos de espera" de gran longitud. Ejecutando desde SSMS no tuvo problemas. | Extraño que ese SQL dinámico en ejecución a través de TADOQuery estaba bien en todas las instancias, a menos que ejecutara un "EXEC ..." para una llamada de procedimiento almacenado. | ¿Hay algo "apagado" en el servidor? – user1631866