Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Una duda con TADODataSet (https://www.clubdelphi.com/foros/showthread.php?t=44350)

LordSarevok 04-06-2007 19:42:42

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.

Caral 04-06-2007 19:51:03

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

LordSarevok 04-06-2007 19:58:33

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.

Caral 04-06-2007 20:03:33

Hola
Te repito de esto no se, pero, que pasaria si elimino del next el close.?
Y cierro en otro evento.
Saludos

Caral 04-06-2007 20:09:49

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

LordSarevok 04-06-2007 20:14:09

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.

maeyanes 04-06-2007 20:14:27

Y cual es el mensaje de error que te da?

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


Saludos...

Lepe 04-06-2007 20:24:05

Si no dices el error que da, poco podemos hacer.

Saludos

Caral 04-06-2007 20:34:24

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 :D
Saludos

maeyanes 04-06-2007 20:38:38

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...

Caral 04-06-2007 20:43:04

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.:D , muy complicado para mi.:)
Saludos

maeyanes 04-06-2007 20:53:02

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

LordSarevok 04-06-2007 21:13:49

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 ;).

Caral 04-06-2007 22:58:09

Hola
Que bien, me estoy metiendo en camisa de once varas.:D
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

LordSarevok 04-06-2007 23:45:45

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.

maeyanes 04-06-2007 23:58:52

Que es lo que haces dentro del while... creo que ahí puede estar el meollo del asunto...


Saludos...

LordSarevok 05-06-2007 00:06:30

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.

Lepe 05-06-2007 10:51:11

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

LordSarevok 05-06-2007 14:16:39

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.

vtdeleon 06-06-2007 05:02:59

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:D.

Saludos


La franja horaria es GMT +2. Ahora son las 06:23:29.

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