PDA

Ver la Versión Completa : Problema con ADO


pepeperezj
21-12-2003, 14:13:40
Hola, estoy empezando con bases de datos bajo delphi y tengo un
problemilla.

Tengo una base de datos (bajo mysql) con una tabla que se llama b, con
dos campos aa y bb, los 2 de tipo integer.

Engancho a la base de datos a traves de ODBC con un ADOConnection.

Ahora viene el problema: Tengo 2 botones, uno para añadir registros a
la tabla y otro para visualizar el contenido de los registros del
campo bb de la tabla:

CODIGO PARA VER CONTENIDO DEL CAMPO BB:
-----------------------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select bb from b');
adoquery1.Open;
for i:=1 to adoquery1.RecordCount do
begin
listbox1.items.add(inttostr(adoquery1.recordset.fields[0].Value));
adoquery1.Recordset.MoveNext;
end;
adoquery1.Close;
end;

CODIGO PARA AÑADIR UN REGISTRO:
-----------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
begin
adoquery1.SQL.Clear;
adoquery1.SQL.Add('insert into b values (8,8)');
adoquery1.ExecSQL;
adoquery1.Close;
end;


PROBLEMA:
-------------------
Pincho en button2 todas las veces que quiero y funciona perfectamente.
A continuacion pincho en button1 y me carga los valores en una lista
sin problemas. PERO si ahora pincho de nuevo en button2 me da el
mensaje siguiente:

ACCESS VIOLATION AT ADDRESS 1F453E6E IN MODULE MSADO15.DLL


¿Que me falta?

Salu2.

pepeperezj
21-12-2003, 14:15:14
Se me olvidaba, utilizo Delphi 7 y MySQL 4.

Salu2.

guillotmarc
21-12-2003, 17:41:47
Quien sabe, quizá por culpa de los campos persistentes, ...

En todo caso, ¿ hay alguna razón para aprovechar tanto un TADOQuery ?. Si simplemente pones 2 TADOQuery, uno para las consultas y otro para las inserciones, te ahorraras este problema.

Además te recomiendo que no modifiques el contenido de la propiedad SQL. Simplemente pón consultas parametrizadas. Algo del tipo :

Consulta : SELECT * FROM B WHERE FECHA = :FECHA

Inserción : INSERT INTO B (CAMPO1, CAMP2) VALUES (:CAMPO1, :CAMPO2)

Ahora el código de los botones te quedará :


procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
adoConsulta.Params.ParamValues['FECHA'] := Date;
adoConsulta.Open;
for i:=1 to adoConsulta.RecordCount do begin
listbox1.items.add(adoConsulta.FieldByName('CAMPO1').AsString);
adoConsulta.Recordset.MoveNext;
end;
adoConsulta.Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
adoInsercion.Params.ParamValues['CAMPO1'] := 8;
adoInsercion.Params.ParamValues['CAMPO2'] := 8;
adoInsercion.ExecSQL;
end;


Saludos