Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema ADO: El valor de BOF o EOF es True, o el actual ...

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema ADO: El valor de BOF o EOF es True, o el actual ... Responder citando

Hola como estan todos, despues de muchísimo tiempo me estoy dando una vuelta por este maravilloso FORO.

Tengo un problema o mas bien me comentaron de un problema al momento de trabajar con una base datos usando ADO, mas exactamente usando un TADOQuery, sucede que se tiene una consulta de un Select que cuando es usado por una 2da vez, este devuelve el siguiente error:

"Problema ADO: El valor de BOF o EOF es True, o el actual registro se eliminó; la operación solicitada requiere un registro Actual".

Rapidamente me puse a hacer una aplicación sencilla donde se tenga un ADOQuery con una consulta y un boton, teniendo lo siguiente:

Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ADOQuery1->Close();
   ADOQuery1->SQL->Clear();
   ADOQuery1->SQL->Add("select LastName, FirstName from employee");
   ADOQuery1->SQL->Add("where FirstName like "+QuotedStr(Edit1->Text+"%"));
   ADOQuery1->Open();
}


y que creen me salió el mismo problema que me describieron alguien sabe porque puede ocurrir y cual seria la solución a este problema.

Muchas gracias de antemano.

Datos Adicionales:
- C++ Builder 5.0
- Windows XP
_________________
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor Yahoo Messenger MSN Messenger
Mensaje    Asunto: ADO: El valor de BOF o EOF (Posible solución) Responder citando

Hola como estan...

Respondo yo mismo, por dos motivos:

1ro. Encontre una posible solucion que quisiera compartir con Uds. (Me tomo toda la tarde hallar esta solucion)
2do. Quisiera saber si existe otra solucion mejor.

Bueno como les dije encontre una posible solucion que se menciona en algun lugar, no recuerdo la dirección, pero basicamente consiste en compilar el programa usando C++ Builder 6.0 o superior porque tal parece haber un problema de versiones de la MDac.

Probe la solución que se propone de compilarlo o migrarlo a C++ Builder 6.0 y funcionó. Coloqué esta solución como una posible solución porque me quede con la espinita de la duda. ¿Como puedo hacer que mi programa funcione perfectamente en C++ Builder 5.0 sin tener que migrarlo a otra versión?.

Ojalá las personas mas experimentadas en esto me puedan ayudar y asi tambien ayudar a otras personas con el mismo problema.

Saludos, y nuevamente gracias por hacer de este FORO uno de los mejores que hay en la red.

Antes de irme, revise mi historial de páginas visitadas y aqui les dejo la página donde encontre la solución (Esto para respetar los derechos de autor)

http://www.solocodigo.net/foros/viewtopic.php?f=16&t=5619

Hasta la próxima.
_________________
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

Código:
   ADOQuery1->Close();
   ADOQuery1->UnPrepare(); // <-- usa esto aqui
   ADOQuery1->SQL->Clear();
   ADOQuery1->SQL->Add("select LastName, FirstName from employee");
   ADOQuery1->SQL->Add("where FirstName like "+QuotedStr(Edit1->Text+"%"));
   ADOQuery1->Prepare(); // <--- y esto aqui antes de abrir
   ADOQuery1->Open();


Algunas sentencias de bases de datos se quedan "colgadas" en el servidor, por ello es buena referencia usar UnPrepare() y Prepare(), eliminar esas referencias y realizar las consultas como si fuera siempre la primera vez
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Cesar...

Gracias por tu respuesta pero lastimosamente no me sirvio o al menos no lo pude hacer funcionar...

Buscando un poco en la ayuda de C++ Builder 5.0 pude observar que UnPrepare y Prepare no son metodos que se puedan usar en los objetos ADOQuery.



Ojala puedas darle una revisada y corregirme si estoy equivocado.

Por lo pronto gracias a la iniciativa de mi amigo Victor Hugo, pude resolverlo usando un ADOQuery Adicional que se encarga de hacer una consulta del conteo de registros que devuelve la sentencia anterior, en caso de tener un resultado mayor a 0, recien se efectua la anterior sentencia. Si a alguien le interesa aviseme para colocarlo un poco mas explicado

Nuevamente Cesar muchas gracias por la respuesta y que todos los miembros del foro hayan pasado unas felices fiestas de fin de año y este 2010 este lleno de bendiciones para uds y sus familias...

Hasta la proxima
_________________
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

prueba poniendo antes del Close un first

Código:
ADOQuery1->First();
ADOQuery1->Close();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.