Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-09-2003
rafita rafita is offline
Miembro
 
Registrado: ago 2003
Ubicación: Cuenca- España.
Posts: 309
Poder: 21
rafita Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 23-09-2003
Lmas Lmas is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 27
Poder: 0
Lmas Va por buen camino
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...

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
__________________
Una cosa es una cosa, y otra cosa es otra cosa...
Responder Con Cita
  #3  
Antiguo 23-09-2003
rafita rafita is offline
Miembro
 
Registrado: ago 2003
Ubicación: Cuenca- España.
Posts: 309
Poder: 21
rafita Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 24-09-2003
Lmas Lmas is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 27
Poder: 0
Lmas Va por buen camino
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...
SalU2
__________________
Una cosa es una cosa, y otra cosa es otra cosa...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:17:52.


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
Copyright 1996-2007 Club Delphi