| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Raúl Capt


Registrado: 16 Ago 2002Mensajes: 174Ubicación: Oruro (Bolivia)
|
Publicado: Mar 15 Dic, 2009 1:53 am Asunto: Problema ADO: El valor de BOF o EOF es True, o el actual ... |
|
|
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 |
|
 |
Raúl Capt


Registrado: 16 Ago 2002Mensajes: 174Ubicación: Oruro (Bolivia)
|
Publicado: Mar 15 Dic, 2009 2:03 am Asunto: ADO: El valor de BOF o EOF (Posible solución) |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 19 Dic, 2009 6:23 am Asunto: |
|
|
| 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 _________________
 |
|
| Volver arriba |
|
 |
Raúl Capt


Registrado: 16 Ago 2002Mensajes: 174Ubicación: Oruro (Bolivia)
|
Publicado: Sab 09 Ene, 2010 11:41 pm Asunto: |
|
|
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 |
|
 |
2H Cdt

Registrado: 06 May 2010Mensajes: 9
|
Publicado: Vie 07 May, 2010 8:47 pm Asunto: |
|
|
prueba poniendo antes del Close un first
| Código: | ADOQuery1->First();
ADOQuery1->Close(); |
|
|
| Volver arriba |
|
 |
|