Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-06-2007
LordSarevok LordSarevok is offline
Miembro
 
Registrado: abr 2007
Posts: 16
Poder: 0
LordSarevok Va por buen camino
Una duda con TADODataSet

Hola a todos, estoy haciendo una aplicacion que usa una base de datos en acces (no tengo mas remedio que usarla) e investigando como insertar/obtener datos de la bd me encontre con este objeto, pero algo debo hacer mal ya que si al hacer un select, este no devuelve ningun resultado, salta una excepcion a la hora de hacer el close.

Esto lo puedo evitar haciendo un count de la consulta antes, pero me parece una chapuza y por eso me paso por aqui porque no doy con otra solucion.

La linea de conexion no os la voy a soltar porque es larguisima, pero todo va ok salvo ese caso que os comento, os pongo el codigo.

Código:
 this->ADOConnection1->Connected=true;  
 this->ADODataSet1->Connection=this->ADOConnection1;
 this->ADODataSet1->ConnectionString=this->ADOConnection1->ConnectionString;
 this->ADODataSet1->CommandText="Select * from tabla";
 this->ADODataSet1->Active=true;
 this->ADODataSet1->Open();
 while (this->ADODataSet1->Eof!=true)
  {
     this->ADODataSet1->FieldByName("nombre")->AsString);
     this->ADODataSet1->Next();
  }
this->ADODataSet1->Close(); //Aqui da el error
El error viene a ser que con eof==true no puede hacer el close, cosa que no acabo de entender ya que una consulta se recorre hasta el final.

Si estais pensando porque no uso TADOQuery es porque no me ha hecho falta, con este objeto puedo hacer insert,update, delete y select sin problemas, salvo el que os comento claro esta.

Gracias a todos.
Responder Con Cita
  #2  
Antiguo 04-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No se de C ++ ni de builder, pero me parece raro que se abra la consulta y se cierre de inmediato.?
Para que recorrer toda la tabla con eof, si la vas a cerrar enseguida, no tendria que estar en otro procedimiento el cierre?
Bueno la verdad, no se, es solo un comentario.
Saludos
Responder Con Cita
  #3  
Antiguo 04-06-2007
LordSarevok LordSarevok is offline
Miembro
 
Registrado: abr 2007
Posts: 16
Poder: 0
LordSarevok Va por buen camino
Hago el open para abrir la consulta, la recorro hasta eof y dentro del while esta el next que te hace avanzar en el recorrido, cuando llegas al final salgo del bucle y hago el close. Y es al hacer ese close, con eof==true cuando da el fallo.
Responder Con Cita
  #4  
Antiguo 04-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Te repito de esto no se, pero, que pasaria si elimino del next el close.?
Y cierro en otro evento.
Saludos
Responder Con Cita
  #5  
Antiguo 04-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Por curiosidad, esto:
Código Delphi [-]
this->ADODataSet1->Active=true;
this->ADODataSet1->Open();
En delphi significan lo mismo, o es uno u otro, para que los dos?
Saludos
Responder Con Cita
  #6  
Antiguo 04-06-2007
LordSarevok LordSarevok is offline
Miembro
 
Registrado: abr 2007
Posts: 16
Poder: 0
LordSarevok Va por buen camino
Eso es un ejemplo de como hago el recorrido, en realidad es una funcion a la que le paso por parametro la consulta y devuelve el TADODataSet para procesarlo a parte, va a una lista o a un stringgrid o a donde sea y al acabar hago el close, ese no es el codigo exacto de la aplicacion, pero con ese ejemplo me ocurre lo mismo.

Lo que no sabia es que el active y el open hacian lo mismo, voy a probar a quitar uno, gracias :P.
Responder Con Cita
  #7  
Antiguo 04-06-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Y cual es el mensaje de error que te da?

Con esto se te podría ayudar un poco más...


Saludos...
Responder Con Cita
  #8  
Antiguo 04-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Si no dices el error que da, poco podemos hacer.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 04-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Como soy un buen estudiante, trato de analizar las cosas un poco.
Sigo con las comparaciones, en Delphi:
Código Delphi [-]
 AQTemp.SQL.Text := 'Select * From TuTabla';
 AQTemp.Active := True;
 While not AQTemp.Eof do
  begin
      ComBoBox1.Items.Add(AQTemp.Fields[0].Text);
      AQTemp.Next;
   end;
   AQTemp.Active := False;
Para mi, no se en c, pero en delphi, se dice While not, osea, si no se encuentra el final.
Se puede hacer algo asi en C ++ ?
A la larga y asta aprendo c
Saludos
Responder Con Cita
  #10  
Antiguo 04-06-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
El equivalente en C sería algo como:

Código:
while (!this->ADODataSet1->Eof)
Donde ! es el equivalente al not de Delphi...


Ahora, mientras no se sepa cual es el error que le devuelve, la verdad solo estamos adivinando... :P

Saludos...

Última edición por maeyanes fecha: 04-06-2007 a las 20:42:18.
Responder Con Cita
  #11  
Antiguo 04-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola maeyanes
Y si es asi, no le falta esto ! a su codigo, o es que no lo necesita.?, o es que esta en otra posicion.
La verdad es pura curiosidad, ya se por que nunca pude aprender C, y asta me compre un librito de 500 paginas. , muy complicado para mi.
Saludos
Responder Con Cita
  #12  
Antiguo 04-06-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
El detalle es que el hace la comparación de otra forma...

Usa el operador != que sería el <> de Delphi...

Código:
while (this->ADODataSet1->Eof != true)

Saludos
Responder Con Cita
  #13  
Antiguo 04-06-2007
LordSarevok LordSarevok is offline
Miembro
 
Registrado: abr 2007
Posts: 16
Poder: 0
LordSarevok Va por buen camino
Sale un cuadro de dialogo con este error:

"Project raised exception class EOleException with message "El valor de BOF o EOF es True, o el actual registro se elimino, la operacion solicitada requiere un registro actual, process stoped...."

Os iba a poner la imagen del cuadro, pero imageshack no quiere que le suba nada xD, gracias .
Responder Con Cita
  #14  
Antiguo 04-06-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Que bien, me estoy metiendo en camisa de once varas.
Que pasaria si hicieramos esto, en la linea de While:

Código Delphi [-]
this->ADOConnection1->Connected=true;  
this->ADODataSet1->Connection=this->ADOConnection1;
this->ADODataSet1->ConnectionString=this->ADOConnection1->ConnectionString;
this->ADODataSet1->CommandText="Select * from tabla";
this->ADODataSet1->Active=true;
this->ADODataSet1->Open();
      while (!this->ADODataSet1->Eof)
  {
      this->ADODataSet1->FieldByName("nombre")->AsString);
      this->ADODataSet1->Next();
  }
this->ADODataSet1->Close(); //Aqui da el error
Por algun lado es, el mensaje dice que encontro true, creo que lo confunde con un dato.
Saludos
Responder Con Cita
  #15  
Antiguo 04-06-2007
LordSarevok LordSarevok is offline
Miembro
 
Registrado: abr 2007
Posts: 16
Poder: 0
LordSarevok Va por buen camino
el !this->ADODataSet1->Eof es igual que el this->ADODataSet1->Eof!=true, es como el i++ o el i=i+1; aunque se escriban de forma diferente, funcionan igual, no es mas que una comodidad para el programador (vamos eso creo). Yo uso el !=true porque me gusta mas.

El mensage yo lo entiendo como si intentase cerrar con el objeto estando nulo o algo parecido, pero eso me parece imposible, joer que es una consulta y pueden existir algunas con 0 tuplas.

Es que aunque no acceda al eof, este va a estar a true si la consulta no devuelve nada, no me valdria ni siquiera saber cuantas filas me devolvio el select.

De momento por no pararme en esto y seguir avanzando lo que hago es un count de la consulta y si es 0 no la ejecuto, asi si funciona, pero es muy bestia tener que hacer dos consultas en vez de una.
Responder Con Cita
  #16  
Antiguo 04-06-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Que es lo que haces dentro del while... creo que ahí puede estar el meollo del asunto...


Saludos...
Responder Con Cita
  #17  
Antiguo 05-06-2007
LordSarevok LordSarevok is offline
Miembro
 
Registrado: abr 2007
Posts: 16
Poder: 0
LordSarevok Va por buen camino
Ahh oki, no llevo un buen dia no...

Pues dentro del while esta el acceso a cada elemento de la consulta y el next para que avance, si quito el next es bucle infinito y si quito la otra sentencia no puedo sacar los datos de la consulta xD.
Responder Con Cita
  #18  
Antiguo 05-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
El código debería ser este:
Código:
this->ADODataSet1->Connection=this->ADOConnection1;
this->ADODataSet1->ConnectionString=this->ADOConnection1->ConnectionString;
this->ADOConnection1->Connected=true;  
this->ADODataSet1->CommandText="Select * from tabla";
this->ADODataSet1->Open;
this-> ADODataSet1->First;
      while (!this->ADODataSet1->Eof)
  {
      this->ADODataSet1->FieldByName("nombre")->AsString); // ¿que hace esto?
      this->ADODataSet1->Next();
  }
this->ADODataSet1->Close(); //Aqui da el error
No entiendo el error que da, no tiene sentido. En principio he modificado el orden de las líneas... más que otra cosa por lógica. Es mejor primero asignar la conexión y después abrirla.

Por otra parte, y dado el error extraño que muestra, me aseguro de ir al primer registro de la consulta con First.

Lo que desde luego me extraña es la "forma de sacar los datos de ese ADODATASET", porque la primera línea del bucle no hace nada. AsString es una función que devuelve el texto, pero el valor devuelto no lo recoges en una asignación, ni un ShowMessage ni nada por el estilo, podría incluso suponerse que el optimizador del compilador elimina esa línea de código tras compilar.

Algo deberás hacer con ese campo "nombre".

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #19  
Antiguo 05-06-2007
LordSarevok LordSarevok is offline
Miembro
 
Registrado: abr 2007
Posts: 16
Poder: 0
LordSarevok Va por buen camino
Ya hombre, lo dije antes, que ese es un ejemplo reducido. En realidad es una funcion que devuelve el TADODataSet para procesarlo y despues lo cierro, solo que asi se veria mas claro que soltando un tochon de codigo.

Lo del first lo quite porque no era necesario, parece que el objeto ya te asigna directamente al primer elemento. Mayormente sera para volver al primero cuando lo necesites dentro de la consulta.

Googleando encontre una solucion, estaba en frances, pero mirabas el codigo y hacia la chapucilla del count antes de la consulta xD.
Responder Con Cita
  #20  
Antiguo 06-06-2007
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Cita:
Googleando encontre una solucion, estaba en frances, pero mirabas el codigo y hacia la chapucilla del count antes de la consulta xD.
No seas tacaño y compartela.

Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Edit en TADODataSet scooterjgm Conexión con bases de datos 2 10-04-2006 09:46:36
Trabajando con TADODataset Novato Conexión con bases de datos 2 08-10-2005 23:57:27
Duda Delphius Varios 5 02-06-2005 07:40:29
TADODataSet VS TADOQuery Mauro.NET Conexión con bases de datos 1 24-05-2005 19:39:57
objeto TADODataSet Nidia H. Ochoa OOP 2 06-07-2004 22:48:12


La franja horaria es GMT +2. Ahora son las 10:01:47.


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
Copyright 1996-2007 Club Delphi