PDA

Ver la Versión Completa : entrando en el mundo ADO


weke
07-06-2004, 12:15:53
Visto lo visto, y como no he sido capaz de encontrar una solución a mi problema he decidido cambiar y empezar a utilizar ADO para conectarme a mi base de datos.
La realidad es que no se nada acerca de ADO, pero es de la única forma de la que he conseguido solucionar una cosa (crear una tabla en access mediante código). En paradox ya lo tenía solucionado, pero por más que he buscado y he investigado no he sido capaz de hacerlo para access.
Ya creo tablas nuevas con ADO, parece que no es muy complicado de utilizar, ahora me gustaría eliminar tablas.

Toda la ayuda que me puedan dar me será útil seguro, o algún hilo que explique alguna cosilla de ADO para ir familiarizándome con el.

El cambio lo realizo, ya que es una aplicación para una base de datos personal y acabar la aplicación no me urge. Y así podré resolver los problemas futuros más rápidamente.

Muchas gracias de antemano y un saludo a todos los del foro.

__cadetill
07-06-2004, 12:21:31
.....ahora me gustaría eliminar tablas.
Has probado con una sentencia SQL?


drop table MiTabla


PD: no aseguro que funcione, no he trabajado con ADO, pero por probar...... :p

__marcsc
07-06-2004, 12:24:36
Hola,

yo creo que lo único que tienes que hacer es poner un ADOCommand que envie a la conexión el Drop Table que te comenta cadetill.

Saludos!

weke
07-06-2004, 12:36:07
Gracias por contestar tan rápido. Es justo lo que estaba probando antes de leer vuestros mensajes.

El código que he puesto es el siguiente:

try
ADOCommand1.CommandText:='DROP TABLE ' + tabla_eliminar;
ADOCommand1.Execute;
borrada:=true;
except
ShowMessage('La tabla no se ha podido eliminar correctamente.');
end;


Pero no me la elimina, me salta del 'Execute' al 'except'.

Es lo primero que he probado, porque al crear la tabla lo he hecho con 'CREATE TABLE nombre_tabla' y si que me ha funcionado.

Gracias.

__cadetill
07-06-2004, 12:44:21
Hola Weke

Sin responder a tu pregunta, te daré un consejo. En el manejo de errores, es conveniente saber el error que realmente te da Delphi. Es más fácil capturar los posibles fallos del programa. Para ello, puedes hacer algo así:


try
ADOCommand1.CommandText:='DROP TABLE ' + tabla_eliminar;
ADOCommand1.Execute;
borrada:=true;
except
on E: Exception do
ShowMessage('La tabla no se ha podido eliminar correctamente.'#13#13 +
'Mensaje de error: '#13 + E.Message);
end;


Es una buena costumbre ;)

weke
07-06-2004, 13:16:35
Gracias por el consejo cadetill.
Ya he conseguido que me borre correctamente la tabla.

Ahora, todo lo que crean que sea interesante saber acerca de ADO, me vendrá bien. Si me sale alguna dudas más os la haré llegar.

Muchas gracias otra vez a todos.

Saludos.:D

weke
07-06-2004, 13:41:53
He colocado un 'ADOConnection' en el formulario principal. Lo he declarado como publico para que todos los componentes se conecten a él.
He asignado los datos que tenía en la propiedad "ConnecionString" del 'ADOCommand'.
Pero cuando ejecuto la aplicación, me da el error siguiente:

Class TADO Connection not found.
La propiedad "LoginPrompt" la he puesto a false para que no me pida clave.
Ya no he tocado ninguna propiedad más.

¿Debería hacer algo más o así ya debería funcionar?

Muchas gracias y un saludo.

__marcsc
07-06-2004, 14:35:25
La conexión te funciona en tiempo de diseño y te da error al ejecutar? O la creas por código?

FNADALO
07-06-2004, 14:40:59
Fijate en la propiedad Active debes ponersela a True,
yo al contrario que tú he trabajado siempre con Ado frente a
Access o Sql Server, muy buena elección Ado, Te felicito
ahora dejate darte unos consejos, pon un Datamodule donde
solo tendrás el AdoConnection y pasasela a todo formulario que
crees, no hace falta de este modo crearla como Public, ya lo
será, el segundo tema a plantearte es el siguiente trabajara tus aplicaciones
Cliente/Servidor, con muchos registros, supongamos que me respondes que si
entonces el proximo paso será un AdoQuery donde lo conectaras al AdoConnection y pondrás tus propios Selects, Agregaras un DataSouce
y asi ya tienes un Recodset Actualizable,,,, empieza por aqui Saludos.

weke
07-06-2004, 14:44:10
La conexión la creo en tiempo de diseño, en tiempo de ejecución solo voy a conectarla (cuando cree la aplicación) y desconectarla (cuando la cierre):

Connected:=true;
Conencted:=false;


Pero de momento no la he dejado a false porque me da el error antes de crear la aplicación, y me sigue dando el error.

Gracias.

Nelet
07-06-2004, 15:10:24
En la cláusula USES tienes la referencia a ADOdb?

weke
08-06-2004, 07:18:24
Gracias, Fnadalo, por tus consejillos. Los pondré en práctica en cuanto pueda.

Ahora respondiendo a la pregunta de Nelet, si tengo la referencia a ADODB en el uses.

weke
08-06-2004, 07:54:35
Fnadalo, ya he modificado lo del Datamodule que me indicaste, funciona muy bien, gracias otra vez.
Con respecto a si utilizao muchos registros, pues de 100 para arriba. Antes tenía hechas una serie de consultas que me funcionaban correctamente, pero en ADO no se si cambiará en algo. La verdad es que no he tocado nada de la consulta que tenía, simplemente le he cambiado el nombre al ADOQuery y he ejecutado, pero la consulta no me devuelve nada. Un ejemplo de consulta es la siguietne:

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM Music WHERE Formato like "*' + aux + '*" order by Grupo');
Query1.Active:=true;
Query1.Open;

Si hay algún error, gracias por indicármelo.

Saludos.

FNADALO
08-06-2004, 08:10:01
Weke te paso un código que es como lo utilizo este genera
un Abm a partir de unos campos y una tabla,

AdoQuery1.Close;
AdoQuery1.SQL.Clear;
ADOQuery1.Connection := DataModule1.ADOConnection1;

if SqlStr.Text <>'' then
begin
AdoQuery1.SQL.Add(SqlStr.Text)
end
else AdoQuery1.SQL.Add('Select * From '+ Tabla.Text);

// AdoQuery1.SQL.Add(SqlStr);
// AdoQuery1.SQL.Add('Select * From '+ Tabla );
if Busca.Text <> '' then
begin
AdoQuery1.SQL.Add('where '+ Busco.Text);
AdoQuery1.SQL.Add(' LIKE '+ quotedStr(Busca.Text) +' + ' + '''%''');
end;


AdoQuery1.SQL.Add('ORDER BY ' + Busco.Text);
AdoQuery1.Open;

// Asignación al Objeto DataSource el DataSet. ---
DataSource1.DataSet := AdoQuery1;

Fijate en la linea que tengo el Like.

weke
08-06-2004, 08:38:06
He hecho la siguiente modificación pero sigue sin devolverme nada:


Query1.SQL.Add('SELECT Teléfono, Nombre, Apellidos, TeléfonoMóvil, Cumpleaños FROM '+
'Agenda WHERE Nombre like "*' + quotedStr(aux) + '*" order by Nombre');

Seguiré probando.

FNADALO
08-06-2004, 09:12:49
Weke
no Admite el * en su lugar debes poner lo siguiente

WHERE Nombre like QuotedStr(aux)+ '%'

Pruebalo y dime cosas...

fjcg02
08-06-2004, 09:20:32
Si analizas lo que estás enviando como SQL, será algo como
SELECT * FROM TABLA where CAMPO LIKE "*'valor_de_aux'*"
Por eso no te devuelve nada.

Prueba a poner Query.Add('SELECT * ... WHERE CAMPO LIKE '+Quotedstr('%'+valor_de_aux+'%'))

A ver si tienes suerte.

Un saludo

weke
08-06-2004, 09:22:30
He cambiado los '*' por '%', pero sigue sin devolverme nada.
También he puesto directamente lo que tu me has dicho con el mismo resultado, nada. La verdad es que me extraña mucho, pero seguro que es una tontería.

WHERE Nombre like ' + quotedStr(aux) + '%' + ' order by Nombre'

Tenía puesto '*' porque es el comodín de access, con el '%' no funcionaba.
Gracias.

weke
08-06-2004, 09:28:41
Gracias fjcg02, era eso, que no colocaba en el sitio adecuado los comodines.

Ahora si que me funciona, probaré con el resto de consultas que tengo que realizar y si me sale algún fallito más ya os lo comento.

Muchas gracias a todos por el interés y la ayuda prestada. Eso de empezar a utilizar una cosa nueva siempre te da los problemas más tontos del mundo.:D
Saludos.

fjcg02
08-06-2004, 09:30:43
sigues haciéndolo como no se debe
Si vuelves a analaizar te queda
"WHERE Nombre LIKE 'valorde_aux'+% order by Nombre"
Necesitas generar
"WHERE Nombre LIKE 'valorde_aux%' order by Nombre"

Así, el códifo será
Código Delphi:
WHERE Nombre like ' + quotedStr(aux + '%') + ' order by Nombre'

Ligero detalle

Un saludete

Nelet
08-06-2004, 09:32:18
Me parece que os estais liando con el quotedstring, prueba asi:


WHERE Nombre like ' + quotedStr(aux+'*') + ' order by Nombre'


y si no


aux:=aux+'*';
bla...bla..bla...WHERE Nombre like ' + quotedStr(aux) + ' order by Nombre'



Como bien dices weke el comodin en access es *

Pd: es mi primera prueba con las etiquetas delphi, lo siento si no sale como debe.

weke
08-06-2004, 14:30:15
Me ha salido otro problemilla.

Antes a la hora de buscar un registro con clave primaria de dos campos, utilizaba lo siguiente:

Table1.FindKey([telefono.Text, nombre.Text]);

Pero con ADO no está esta función 'FindKey'. Estoy intentando utilizar la función 'Locate', pero algo no tengo que estar haciendo bien porque me da error.

Table1.Locate(Table1.IndexName,[telefono.Text nombre.Text],[loCaseInsensitive]);


Gracias y un saludo.

cbrrr
08-06-2004, 14:36:33
El Locate funciona de la siguiente manera


Tabla.Locate('campo1; campo2; campo3', varArrayOf([var1, var2, var3]), [loPartialKey]);


A partir de Delphi 6, el VarArrayOf está en la unit Variants, por lo que tendrás que añadirla en el uses si no está

Espero que te sirva

__marcsc
08-06-2004, 14:49:38
Además del Locate existe una función Seek, más parecida a FindKey, que utiliza el índice actual para la búsqueda. Aunque sea una función de los componentes ADO solo funciona con el proveedor Jet 4.0 y Access a partir del 2000. (esto según el help de Delphi 6, no sé si ahora ha cambiado)

Quizás te interese o te permita realizar búsquedas más rápidas.

Personalmente no me interesa porqué:

1. Utilizo ADO con SQL Server y por lo tanto no está soportado.
2. Considero que unos componentes que permiten conectarse a multitud de bases de datos implementen una función que solo sirve para un driver en concreto.

En fin, nunca está de más de saberlo :)

Un saludo.

weke
08-06-2004, 14:54:24
Muchas gracias cbrrr por la solución.

Y a ti, marcsc, por el comentario. Lo tendré en cuenta.

Saludos.:)