Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problema recordset vacio en Procedimiento almacenado con ADO (https://www.clubdelphi.com/foros/showthread.php?t=58051)

2-D@monic 07-07-2008 03:12:49

Problema recordset vacio en Procedimiento almacenado con ADO
 
Hola a todos, tengo un problema...... estoy manejando procedimientos almacenados con postgres y ado-odbc para la conectividad, todo va bien.... el problema es cuando ejecuto un procedimiento de búsqueda y no me devuelve nada (no existe el registro) me bota un error que dice: "El valor de bof o eof es true, o el actual registro se eliminó; la operación solicitada requiere un registro actual".

Cuando hay registros que coinciden con búsqueda me devuelve datos, los muestro, todo normal, el problema es cuando no existe registro que satisfaga la búsqueda (select no devuelve nada), el programa me bota ese error y ya no puede realizar búsquedas, ni las que realizaba con éxito.

Bueno....... según la documentación de Microsoft respecto a ado es porque estoy cerrando el recordset vacío (utilizo el metodo CLOSE para el ADOSTOREDPROC y desactivo-activo un DATASOURCE vinculado al proc para actualizar la info en un DBGRID).

Alguna Sugerencia?
Gracias por adelantado

tcp_ip_es 07-07-2008 12:54:02

Haces alguna operación con el AdoStoredProc??? algo como moverte por los registros asi como AdoStoredproc.first??? Es posible que al no tener datos e intentar moverte por los registros te tire ese error. Lo ideal antes de moverte es ver si ese dataset tiene datos. algo como:

Código:

if AdoStoredProc1.IsEmpty then
 Hago lo que tenga que hacer....

Saludos, Tony

2-D@monic 07-07-2008 16:57:48

aquí está el código
 
Gracias por la respuesta, la verdad no estoy recorriendo el dataset sino que solo ejecuto el procedimiento, este me devuelve registros y solo muestro el resultado, en realidad es una función en postgresql que me devuelve un set of record:


Código:


 DataModule2.buscar_cliente.Close();
 DataModule2.buscar_cliente.Parameters[0].Value=Edit21.Text;
 DataModule2.buscar_cliente.Prepared=True;
 DataModule2.buscar_cliente.ExecProc();
 DataModule2.buscar_cliente.Open();
 if (DataModule2.buscar_cliente.RecordCount=0) then
 begin
        ShowMessage('No hay coincidencias');
        DataModule2.DataSource2.DataSet.Active=False;
 end;
 else
        DataModule2.DataSource2.DataSet.Active=True;

Como ves, solo activo el datasource en caso de que hay registros encontrados, sino lo desactivo; este datasource está conectado a un dbgrid para mostrar los registros.

El problema va cuando no ecuentra coincidencias, me muestra el mensaje de "el valor bof o eof es true..............." y la búsqueda ya no funciona más, solo me muestra el mensaje cada vez que ejecuto el procedimiento. Parece que tendría que "reiniciar" el procedimiento cada vez que lo ejecuto pero no sé como hacerlo.

tcp_ip_es 08-07-2008 09:12:28

Si el resultado del StoredProc es un conjunto de registros no deberías de llamar a ExecProc simplemente llama a Open, a parte de poner el prepared a false antes de asignar parametros....

Código:

DataModule2.buscar_cliente.Close;
 DataModule2.buscar_cliente.Prepared=False;
 DataModule2.buscar_cliente.Parameters[0].Value=Edit21.Text;
 DataModule2.buscar_cliente.Prepared=True;
 DataModule2.buscar_cliente.Open;
 if (DataModule2.buscar_cliente.isempty) then
 begin
        ShowMessage('No hay coincidencias');
        DataModule2.DataSource2.DataSet.Active=False;
 end
 else
        DataModule2.DataSource2.DataSet.Active=True;


2-D@monic 08-07-2008 19:14:09

Ok.......... cambie el código como me indicaste pero igual da el error ese y la búsqueda ya no jala, bueno entonces cual es la diferencia entre ExecProc y Open?

tcp_ip_es 09-07-2008 07:36:36

a ser posible indicanos el código del storeproc.


P.D. En principio el execproc no devuelve cursor y el open si, es decir el execproc es para consultas que no sean select y no devuelven conjunto de datos vease insert, updates...


La franja horaria es GMT +2. Ahora son las 09:58:39.

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