Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   SQL y Delphi (https://www.clubdelphi.com/foros/showthread.php?t=17980)

Sotrono 27-01-2005 21:13:13

SQL y Delphi
 
Hey, como va?
Como puedo manipular una base de datos utilizando SQL?
En realidad lo que quiero saber es como establecer la conexion entre la base de datos y el programa.

roman 27-01-2005 22:03:07

Tendrías que decirnos qué base de datos piensas usar.

// Saludos

Sotrono 28-01-2005 01:09:53

Mi idea es aprender SQL para poder conectarme a cualquier base de datos, pero bueno voy a empezar con una Acces.

roman 28-01-2005 01:38:50

En tal caso una opción son las componentes ADO.

Para hacer la conexión necesitas una componente TADOConnection y configurar su propiedad ConnectionString. Para ello lo más sencillo es que abras el editor de dicha propiedad desde el inspector de objetos y oprimas el botón "Build...". En la ficha "Proveedor" selecciona "Microsoft Jet 4.0 OLE DB Provider" y en la ficha "Conexión" seleccionas la base de datos de Access.

Una vez configurada la cadena de conexión pones en false la propiedad LoginPrompt (a menos que requieras un usuario y contraseña para acceder a la base).

Para hacer las consultas SQL requieres una componente TADOQuery. La consulta en sí la pones en la propiedad SQL y ejecutas la consulta ya sea con el método Open o con ExecSQL dependiendo del tipo de consulta de que se trate. El primer método es para consultas que regresan registros como SELECT y el segundo para consultas que no regresan registros como INSERT, UPDATE y DELETE.

Puedes usar parámetros en tus consultas, por ejemplo:

Código SQL [-]
select * from personas where nombre like :nombre and edad > :edad

Aquí los dos puntos que preceden a "nombre" y "edad" indican que éstos son parámetros.

Antes de ejecutar una consulta con parámetros debes asiganre valores a éstos. Para ello usas la propiedad Parameters del ADOQuery y su método ParamByName:


Código Delphi [-]
ADOQuery1.Parameters.ParamByName('nombre').AsString := 'PEREZ%';
ADOQuery1.Parameters.ParamByName('edad').AsInteger := 24;

Come ves, ParamByName regresa un objeto de tipo TParameter y debes usar el método AS--- que corresponda al tipo de datos.

En el ejemplo, una vez sustituidos los parámetros la consulta queda:


Código SQL [-]
select * from personas where nombre like "PEREZ%" and edad > 24

que te buscará todos los registros de la tabla `personas` cuyo nombre comienza con "PEREZ" y cuya edad es mayor de 24 años.

Una vez ejecutada la consulta (en este caso con Open) puedes recorrer los registros resultantes con el método Next del ADOQuery. En cada registro puedes acceder a los campos mediante el método FieldByName:

Código Delphi [-]
while not ADOQuery1.Eof do
begin
  {
    Accedes a los campos con
      ADOQuery1.FieldByName('nombre').AsString y
      ADOQuery1.FieldByName('edad').AsInteger y
  }

  ADOQuery.Next;
end;

Como te darás cuenta, Eof es una propiedad de ADOQuery que determina si ya alcanzaste el final de los registros.

También puedes conectar el ADOQuery mediante un TDataSource a cualquier componente de acceso a datos como un TDBNAvigator, TDBGrid, TDBEdit, etc.

// Saludos

Sotrono 28-01-2005 20:01:38

Ok, muchas gracias por tu Mini-Tutorial de SQL en Delphi.
Ya pude hacer la conexion y ahora voy a empezar a profundizarme mas en el tema.

vtdeleon 22-08-2005 09:15:56

Saludos
Este hilo es un poco viejor pero...
Cita:

Empezado por roman
Código Delphi [-]
 ADOQuery1.Parameters.ParamByName('nombre').AsString := 'PEREZ%';
 ADOQuery1.Parameters.ParamByName('edad').AsInteger := 24;

Come ves, ParamByName regresa un objeto de tipo TParameter y debes usar el método AS--- que corresponda al tipo de datos.

roman, en realidad en los componentes ado(D7) no existen los metodos AsString, AsInteger,...Solo Existe Value.

Reinicio este hilo ya que estoy teniendo problemas con este componentes y su captura de parametros: Parameters Objects is improperly defined. Incosistent o imcomplete information was provider.

Ese es el error que me tira.
Código Delphi [-]
 with AdoQuery do begin
   sql.Text:='Insert into bvnat01 (contrato, codemp, tipre, fechapre, '+
                 'fechamort, forpag, numsem, montopre, balpre, amopre) '+
                 'values(:contrato, :codemp, :tipre, :fecha, :fecha:, '+
                 ':forpag, :numsem, :monto, :monto, :monto)'
   with Parameters do begin
     inc(contrato);
     ParamByName('contrato').value:=IntToStr(contrato);
     ParamByName('fecha').Value:=Now;
     ParamByName('forpag').Value:='S';
     ParamByName('monto').Value:=edtdesc.Value;
     ParamByName('codemp').Value:=AlignEdit1.Text;
     ParamByName('tipre').Value:='7';
     ParamByName('numsem').Value:=numsem;
   end;
   ExecSQL;
 end;
Hasta luego

Lepe 22-08-2005 11:29:01

Echando un vistazo rápido, veo que fecha lo tienes repetido, y además como ":fecha:" empieza y termina con los 2 puntos.

Error de pegado?

Un saludo

vtdeleon 22-08-2005 15:27:14

Saludos

Cita:

Empezado por lepe
Error de pegado?

No, tienes razon. Esta mal. Gracias por la observacion. Si supieras las veces que lo he chequiado y no lo veia.:P

Cita:

Empezado por lepe
veo que fecha lo tienes repetido,

Nada qeu ver, tengo dos campos fechas qeu al insertarlo deben ser iguales.

Aun sigue dandome error.

Lepe 22-08-2005 16:57:16

No veo error alguno salvo el bug comentado en las MSDN de mocosoft al parecer hay que establecer el Parameter.Size para los parámetros de texto :confused:

Ya me contarás si es cierto. Aunque es código VB, al ser fallo del ADO, digo yo que se podrá solucionar por delphi tambien.

Cita:

With Cmd2
Set .ActiveConnection = Conn
.CommandText = "CustomerByID"
.CommandType = adCmdStoredProc

End With

Cmd2.Parameters.Refresh
Cmd2.Parameters(0).Type = adVarChar
Cmd2.Parameters(0) = "COMMI" 'Set the text parameter value.

' If the next line is omitted you will get an error 3708 -
' "The application has improperly defined a Parameter Object".
Cmd2.Parameters(0).Size = 5


Rs.Open Cmd2, , adOpenStatic, adLockReadOnly
Debug.Print Rs(0), Rs(1), Rs(2)
Rs.Close
Un saludo y suerte

vtdeleon 23-08-2005 18:37:23

Saludos

Ya solucione el problema y era este
Cita:

Empezado por Lepe
veo que fecha lo tienes repetido,

Lepe tenia razon.
A pesar de que los parametro se declaren con igual nombre, son diferentes:eek:. Asi que lo declare con diferentes nombres.:rolleyes:
Cita:

...:fecha,:fecha
Parameter[0] es igual a :fecha
y
Parameter[1] es igual a :fecha
Gracias:cool:


La franja horaria es GMT +2. Ahora son las 22:32:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi