2012-08-29 26 views
11

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.

+0

¿Hay algún error? ¿Has probado Profiler para saber si se ejecutó el procedimiento? ¿Y has intentado ejecutar el procedimiento desde sms? –

+0

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

+0

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

Respuesta

0

Trate de utilizar SQL Server Native Client 10.0 OLE DB

Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase;Uid=myUsername; 
Pwd=myPassword; 
0

Puede intenta quitar simplemente que .1 después SQLOLEDB porque es sólo para especificar el número de versión de su uso.

con.ConnectionString := 'Provider=SQLOLEDB;Password=<testPwd>;Persist Security Info=True;User ID=<testUser>;Initial Catalog=<myDB>;Data Source=<myServer>'; 

Debe tener en cuenta para cambiar a nuevos SQLNCLI conductor.

No ha especificado la versión del servidor de Windows ni la versión del servidor SQL ni la versión de Windows del cliente, sino:
SQLOLEDB debería estar presente también en nuevos sistemas para la compatibilidad con versiones anteriores;
SQLNCLI debe venir con SQL Server 2005;
SQLNCLI10 debe venir con SQL Server 2008;
SQLNCLI11 debe venir con SQL Server 2012 y 2014;
SQLNCLI13 debe venir con SQL Server 2016;

Preste atención a 32/64bit versión de controladores porque para hablar con el servidor sql de 32 bits necesita un controlador de 32 bits y viceversa.

Asegúrese de tener instalado el controlador correcto en sus clientes.

Microsoft® SQL Server® 2016 Feature Pack
Windows 8, 8.1, 10, Windows Server 2012, 2012 R2, 2016
https://www.microsoft.com/en-us/download/details.aspx?id=52676
Encontrará ambas versiones x86/x64 de sqlncli.msi

Microsoft® SQL Server® 2012 Native Client
Windows 7, 8, 8.1, 10, Windows Server 2008 R2, 2012, 2012 R2
https://www.microsoft.com/en-us/download/details.aspx?id=50402
Encontrará ambas versiones x86/x64 de sqlncli.msi

Microsoft® SQL Server® 2008 R2 Native Client
Windows Vista, XP, 7, Windows Server 2003, 2008, 2008 R2
x 86 Paquete : http://go.microsoft.com/fwlink/?LinkID=188400&clcid=0x409
x64 del paquete: http://go.microsoft.com/fwlink/?LinkID=188401&clcid=0x409

respete también OLEDB/ODBC lifecycle, fue declarado obsoleto OLEDB para cambiar a los controladores ODBC más nuevos, pero en octubre pasado que era volver a declarar undeprecated.

Cuestiones relacionadas