FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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.
__________________
Rafita. |
#2
|
|||
|
|||
Hola, rafita.
Cita:
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... 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.') SalU2
__________________
Una cosa es una cosa, y otra cosa es otra cosa... |
#3
|
|||
|
|||
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.
__________________
Rafita. |
#4
|
|||
|
|||
Hola, Rafa.
Vamos con esas dudas... Cita:
Cita:
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:
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... SalU2
__________________
Una cosa es una cosa, y otra cosa es otra cosa... |
|
|
|