Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   SQL Server. Tablas temporales. Diferencias entre ZEOS y ADO (https://www.clubdelphi.com/foros/showthread.php?t=92372)

elliotduvorov 11-10-2017 17:35:44

SQL Server. Tablas temporales. Diferencias entre ZEOS y ADO
 
Buenas a todos,

Estoy intentando crear una tabla temporal desde Delphi con un componente TZQuery, la instrucción SQL quedaria así:

Código SQL [-]
CREATE TABLE #TABLA_PRUEBA(CAMPO VARCHAR(200));

INSERT INTO #TABLA_PRUEBA VALUES ('PROBANDO 1, 2, 3');

A este componente le hago un Execsql. Has aqui todo bien.

En otro componente TZQuery lanzo la siguiente consulta:

Código SQL [-]
SELECT * FROM #TABLA_PRUEBA

Al hacer el open de este segundo TZQuery, me salta un error que dice que el objeto #TABLA_PRUEBA no existe.

Si hago lo mismo pero sustituyendo los componentes ZEOS por ADO funciona correctamente.:confused:

Pienso que hay algún parametro de configuración, en el componente TZConnection de ZEOS, que hace que la conexión se reinicie después de lanzar la primera query, por lo que la tabla temporal desaparece.

¿Alguien que pueda arrojar luz sobre la configuración de ZEOS?

Mi entorno es Delphi 2010 con MSSql Server 12. Version de ZEOS 7.1.4-stable

Un saludo!

bucanero 13-10-2017 11:12:28

Hola elliotduvorov

He estado probando lo que comentas y ciertamente también me hace lo mismo que dices,

Aunque en tu caso al estar ambos componentes enganchados con la misma conexión, si existiera la tabla en teoría deberían de verse...

En tu caso en particular ten en cuenta que estas creando una tabla temporal local (prefijo '#'), que solo tiene validez dentro de la conexión donde la creas y no la pueden ver el resto de conexiones, y que cuando se deja de usar, automaticamente MSSQL la elimina, que creo que es lo que en realidad esta pasando, se crea se inserta el registro y al finalizar la propia consulta el motor la elimina.

Yo como solución que he encontrado es crear la tabla desde el componente zConnection y entonces ya si funciona bien:
Código Delphi [-]
  ZConnection1.ExecuteDirect(
    'CREATE TABLE #TABLA_PRUEBA(CAMPO VARCHAR(200));'
  );

Espero te sirva

Un saludo

elliotduvorov 13-10-2017 11:36:44

Gracias por tu respuesta Bucanero,

Esta mañana he llegado a la misma solucion que comentas. ;)

He puesto la creacion de la tabla temporal tanto en el AfterConnect, como el en AfterReconnect, del componente TZConnection

Despues de darle muchas vueltas, he llegado a la conclusion, que la conexion se abre y cierra en cada consulta lanzada. Tampoco he conseguido averiguar si es posible cambiar este comportamiento.

Lo dicho muchas gracias por tu respuesta.

Un saludo.

olbeup 16-10-2017 13:43:46

Hola elliotduvorov,

Revisa aquí para hacerte una mejor perspectiva de como funciona una tabla temporal.

Un saludo.


La franja horaria es GMT +2. Ahora son las 22:58:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi