![]() |
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; 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. |
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 |
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.
|
Hola
Te repito de esto no se, pero, que pasaria si elimino del next el close.? Y cierro en otro evento. Saludos |
Hola
Por curiosidad, esto: En delphi significan lo mismo, o es uno u otro, para que los dos? Saludos |
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. |
Y cual es el mensaje de error que te da?
Con esto se te podría ayudar un poco más... Saludos... |
Si no dices el error que da, poco podemos hacer.
Saludos |
Hola
Como soy un buen estudiante, trato de analizar las cosas un poco. Sigo con las comparaciones, en Delphi: 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 |
El equivalente en C sería algo como:
Código:
while (!this->ADODataSet1->Eof) Ahora, mientras no se sepa cual es el error que le devuelve, la verdad solo estamos adivinando... :P Saludos... |
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 |
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 |
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 ;). |
Hola
Que bien, me estoy metiendo en camisa de once varas.:D Que pasaria si hicieramos esto, en la linea de While: Por algun lado es, el mensaje dice que encontro true, creo que lo confunde con un dato. Saludos |
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. |
Que es lo que haces dentro del while... creo que ahí puede estar el meollo del asunto...
Saludos... |
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. |
El código debería ser este:
Código:
this->ADODataSet1->Connection=this->ADOConnection1; 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 |
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. |
Cita:
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