Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Insertar o actualizar con ADO (https://www.clubdelphi.com/foros/showthread.php?t=3774)

rafita 19-09-2003 10:38:41

Insertar o actualizar con ADO
 
Tengo dos graves problemas: soy un novato autodidacta, y soy un inutil sin tiempo.

Me explico: Tras una breve experiencia con Interbase-BDE, tengo que hacer una pequeña gestión contra Access (y después en MS-SQL Server) para aprovechar los datos del usuario.

Pero no soy capaz de hacer inserciones ni actualizaciones.

He probado de las siguientes formas:

SqlText:='INSERT INTO Licencias (ExpCodigo, ExpAnno, ExpNEntrada, ExpFEntrada,ExpSituacion, ExpClase, ExpModo, ExpLicObras, ExpLocal) VALUES '+
Edit0.Text+', '+Edit1.Text+', '+Edit2.Text+', "'+Edit3.Text+'", "' Edit4.Text+'", "'+Edit5.Text+'", "'+Edit6.Text+'", "'+Edit7.Text+'", "'+Edit8.Text+'")';

1ª ADOCommand1.CommandText:=SqlText;
ADOCommand1.Execute;

2ª ADOQuery2.Close;
ADOQuery2.SQL[0]:=SqlText;
ADOQuery2.ExecSql;

3ª ADOTable1.Open;
ADOTable1.Insert;
AdoTable1.FieldByName('ExpCodigo').Value:=Edit0.Text;
AdoTable1.FieldByName('ExpAnno').Value:=Edit1.Text;
AdoTable1.FieldByName('ExpNEntrada').Value:=Edit2.Text;
ADOTable1.Post;
ADOTable1.Close;

Siempre me da el error: "La operación debe usar una consulta actualizable". Como si me faltase algún parámetro en los componentes.

¿Alguien sabe que me ocurre?

¿Alguien puede enviarme un ejemplo de inserción o actualización?

Saludos.

Lmas 23-09-2003 02:14:27

Hola, rafita.

Cita:

Tengo dos graves problemas: soy un novato autodidacta, y soy un inutil sin tiempo.
Jodó, parece que necesitas una cura de autoestima :(; aunque todos hemos estado en alguna de esas etapas con esto de la programación. ;)

La verdad es que del código que pones no sé lo que falla... , aunque me da la impresión que no se construye correctamente la consulta SQL al estar algún control de edición vacío. Aunque por otro lado, creo que la forma 3º que utilizas te tendría que funcionar...:confused:

Para ejecutar consultas de actualización yo utilizo el componente ADOConnection:
Código:

// Suponiendo que Cnt es un componente AdoConnection...
// Añadir un registro
  Cnt.Execute(Format('INSERT INTO tabla (numero,texto) VALUES (%d,%s);',
              [ANumero, QuotedStr(ATexto)]), cmdText, [eoExecuteNoRecords]);

// Modificar un registro
var
  RecordsAffected: Integer;
begin
  Cnt.Execute(Format('UPDATE tabla SET texto=%s WHERE numero=%d',
                  [QuotedStr(ATexto), ANumero]), RecordsAffected);
  if RecordsAffected = 0 then
    raise Exception.Create('No se ha modificado ningún registro...');

// Borrar registro
var
  RecordsAffected: Integer;
begin
  Cnt.Execute(Format('DELETE FROM tabla WHERE numero=%d',
              [ANumero]), RecordsAffected);
  if RecordsAffected = 0 then
    raise Exception.Create('No se ha borrado ningún registro.')

Como observación, no construyas la consulta de actualización de la forma ...Edit0.Text+', '+Edit1.Text+', ..., ya que si un usuario introduce en un control de edición alguna comilla, te fallará la consulta. En su lugar utiliza la función QuotedStr.

SalU2

rafita 23-09-2003 13:26:31

Muchísimas gracias Lmas por tu tiempo y por tu interés.

Me has dado exactamente la respuesta que necesitaba (y también animos para seguir), aunque ahora me surgen otras dudas.

En primer lugar te comento que el origen del problema estaba en la conexión, ya que era esta la que me denegaba todas las actualizaciones de la base de datos, pero como me permitía las consultas no pensé que ese fuese el problema.

Las dudas que me surgen al ver tu respuesta son las siguientes:

¿Por qué ADOConnection en vez de los otros componentes?
¿No es mejor utilizar una única conexión en el formulario principal de la aplicación, y utilizar objetos ADO específicos para las otras tareas?

¿Por qué das formato a los datos antes de insertarlos?
Para los campos de tipo fecha el formato es %g y el valor StrToDate(Edit3.Text), pero cómo inserto los campos de tipo memo?

Insisto, muchas gracias por tu respuesta.

Rafa.

Posdata: he escrito y enviado este mensaje cuatro veces, e incluso he llegado a verlo como respuesta, pero después desaparecía, así que disculpadme si luego aparece varias veces.

Lmas 24-09-2003 14:34:15

Hola, Rafa.

Vamos con esas dudas...

Cita:

¿Por qué ADOConnection en vez de los otros componentes?
Te pondría este ejemplo porque al consultar la sintaxis del Execute, miré un programa "sui generis" que utiliza dos archivos MDB con sus correspondientes conexiones. Un MDB se utiliza para los datos del programa en sí, y el otro para registro de eventos de qué hace cada usuario en el programa. El MDB de eventos sólo se utiliza para escribir registros, y la forma más sencilla es con el Execute del objeto Conexión.

Cita:

¿No es mejor utilizar una única conexión en el formulario principal de la aplicación, y utilizar objetos ADO específicos para las otras tareas?
Creo que lo mejor es utilizar el AdoCommand, y más teniendo en cuenta que pasarás la aplicación a SQL Server, y esas sentencias se convertirán en procedimientos almacenados.
En cuanto a las conexiones, si, debe utilizarse una; aunque me suena haber leído que en las primeras versiones de ADO (¿hasta la 2.1?) si se intentaba utilizar una conexión que estaba ocupada, saltaba un error; en cambio en las versiones más recientes de ADO, automáticamente se crea otra conexión... Vamos, que en cierto modo el ADO tiene vida propia.

Cita:

¿Por qué das formato a los datos antes de insertarlos?
Cuestión de gustos. Considero que se lee mejor con Format('INSERT ...', [Parametros...]) que con 'INSERT ... ' + IntToStr(Parametro) + ...
En cuanto a los campos memo-blob, de esta forma no se puede; lo suyo es hacerlo todo con el AdoCommand y pasar el blob como un parámetro más.

Espero no haberte creado más confusión... :confused:
SalU2


La franja horaria es GMT +2. Ahora son las 10:25:56.

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