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 11-01-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
Red face Enviar parametros desde Delphi a Storage Procedures en BD Firebird

Buen día.

DESCRIPCIÓN:
Tengo una base de datos que contiene múltiples tablas, algunas de éstas a su vez tienen dependencia de otras.

He creado varios procedimientos almacenados para ejecutar acciones desde ahi, como la inserción de la información a las tablas o el borrado de registros. Éstos procedimientos dependen de recibir ciertos valores para realizar las acciones según en base a ello.

He podido ejecutar procedimientos desde Delphi que he creado para armar algunas consultas en base a varias tablas pero sin enviar parametros de por medio.

Ahi es donde radica mi problema:

PROBLEMA:
Necesito ejecutar un procedimiento pero enviandole parametros de por medio.

Alguien sabe como hacerlo. Quizas mi duda sea muy simple pero agradecería la ayuda.

Gracias y espero su respuesta.

Estoy utilizando los componentes:

IBDatabase, IBDataset e IBTransaction para trabajar con la BD.
Responder Con Cita
  #2  
Antiguo 12-01-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por cuburu
Necesito ejecutar un procedimiento pero enviandole parametros de por medio.
...
Estoy utilizando los componentes:

IBDatabase, IBDataset e IBTransaction para trabajar con la BD.
Pues te hace falta usar un TIBStoredProc, asociarlo al procedimiento almacenado que te interesa ejecutar y los parámetros los asignas por médio de la propiedad Params de dicho componente.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 12-01-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
Red face Más detallado

Como lo habia comentado, ya he podido ejecutar procedimientos almacenados en la BD ytilizando precisamente el componente TIBStoredProc. pero el problema radica en que no conozco como escribir la sentencia que hará tal situación.

Por ejemplo:

El procedimiento se llama InsertCliente(nomb, dir, tel, email) y para llamarlo solo lo selecciono en el componente TIBStoreProc y lo activo en tiempo de ejecución para que no marque problemas.

Pero para enviarle los parametros es ¿igual que cuando asigno valores a variables en un SQL normal? como pro ejemplo:

Código Delphi [-]
SQLEjemplo.SQL.Clear;
SQLEjemplo.SQL.ADD('SELECT * FROM clientes WHERE nombre = :NOMB');

SQLEjemplo.----.ParamByName('NOMB').AsString := 'Dato';

Perdón por escribirlo asi pero esque no tengo el Delphi a la mano en este momento.

Gracias de antemano.
Responder Con Cita
  #4  
Antiguo 12-01-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Al soltar un TIBStoredProc en tu forma o módulo de datos, asocialo a una base de datos y una transacción, luego estableces su propiedad StoredProcName correctamente, y en la propiedad Params tenes los parámetros, tanto en tiempo de diseño como de ejecución.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 12-01-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
Question Duda sobre firebird embedded

No me afectaría el tener que desinstalar el firebird que ya tengo y tener que reinstalar el embedded a mi base de datos que estoy utilizando.
Responder Con Cita
  #6  
Antiguo 12-01-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por cuburu
No me afectaría el tener que desinstalar el firebird que ya tengo y tener que reinstalar el embedded a mi base de datos que estoy utilizando.
No entiendo a que viene esto...

Para darte tranquilidad te se decir que firebird ofrece el mismo comportamiento en el servidor embebido que en el servidor normal, con la diferencia que el embebido (por obvias razones) no tiene soporte para múltiples usuarios.

Saludos.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 13-01-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
Post Perdón....

Parece ser que coloque el mensaje en el hilo equivocado, lo que necesitaba saber sobre el envío de paramentros a un procedimiento almacenado de la siguiente forma:

La sintaxis que se coloca para enviar los parametros a un procedimiento almacenado es la misma que cuando se le envia información a variables en SQL con delphi:

Ejemplo:

mi tabla se llama clientes.bgd por dar un ejemplo y tiene los campos nombre, direccion, telefono, email. El código para hacer una consulta seria ango así:

Código Delphi [-]
  SQLEjemplo.SQL.Clear;
  SQL.----.ParamByName('NOMB').AsString := 'Dato Nombre';
  SQL.----.ParamByName('MAIL').AsString := 'Dato EMail';

  SQLEjemplo.SQL.Add('SELECT * FROM clientes.bgd WHERE nombre = :NOMB AND email = :MAIL');

con esto se asignarían valores a los parametros de una consulta a una tabla.

Ahora, el procedimiento se llama consulta_cltes y los campos son nombre, direccion, telefono, email, los valores de entrada son NOMB y MAIL, igual que la consulta anterior.

¿como podría asignar los parametros deseados?

Gracias de antemano y perdón por la metida de pata pero es que es parte de lo que estoy investigando y me cuatrapie
Responder Con Cita
  #8  
Antiguo 13-01-2006
Ricardojosep Ricardojosep is offline
Miembro
 
Registrado: sep 2003
Ubicación: Sgo del estero (Argentina)
Posts: 75
Poder: 21
Ricardojosep Va por buen camino
Hola cuburu

No te entendi muy bien. me confunde unas cositas como esto:

Cita:
mi tabla se llama clientes.bgd por dar un ejemplo y tiene los campos nombre, direccion, telefono, email. El código para hacer una consulta seria ango así:


SQLEjemplo.SQL.Clear;
SQL.----.ParamByName('NOMB').AsString := 'Dato Nombre';
SQL.----.ParamByName('MAIL').AsString := 'Dato EMail';

SQLEjemplo.SQL.Add('SELECT * FROM clientes.bgd WHERE nombre = :NOMB AND email = :MAIL');

con esto se asignarían valores a los parametros de una consulta a una tabla.

Ahora, el procedimiento se llama consulta_cltes y los campos son nombre, direccion, telefono, email, los valores de entrada son NOMB y MAIL, igual que la consulta anterior.

¿como podría asignar los parametros deseados?
Creo que el amigo jachguate, ya respondio tu pregunta.
Si lo que quieres es enviar parametros al SP, debes utilizar el componente TIBStoredProc, En tiempo de ejecucion debes poner algo como esto:
Código Delphi [-]
IBStoredProc1.ParamByName('IP').AsString := IPNum;
IBStoredProc1.ExecProc;

con la primera sentencia le asignas un valor al parametro y con la segunda ejecutas el SP
Si tienes algun parametro de salida, puedes visualizarlo con esto:

Código Delphi [-]
Salida := IBStoredProc1.FieldByName('Parametro_De_Salida').AsString;
__________________
La amistad es la union de dos almas para formar una sola.
Responder Con Cita
  #9  
Antiguo 15-01-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
Lightbulb

Gracias.

Para que entiendan, lo que deseo es enviar una consulta filtrada basada en el nombre y apellidos de una persona.

el código del procedimiento almacenado es:

Código:
  CREATE PROCEDURE CONSPERSONAS (
    NOMBREI VARCHAR (40) CHARACTER SET WIN1252,
    APELLIDOSI VARCHAR (40) CHARACTER SET WIN1252)
RETURNS (
    NOMBREO VARCHAR (40) CHARACTER SET WIN1252,
    APELLIDOSO VARCHAR (40) CHARACTER SET WIN1252,
    EMAILO VARCHAR (100) CHARACTER SET WIN1252)
AS
BEGIN
  /*NOMBRE Y APELLIDOS*/
  if ( not (NOMBREI is null and APELLIDOSI is null) ) then
  begin
    select NOMBRE, APELLIDOS, EMAIL
    from personas
    where NOMBRE like '"%' || :NOMBREI || '%"' and
          APELLIDOS like '"%' || :APELLIDOSI || '%"'
    into :NOMBREO, :APELLIDOSO, :EMAILO;
    
    suspend;
  end
  else
  begin
    /*NOMBRE*/
    if (not NOMBREI is null) then
    begin
      select NOMBRE, APELLIDOS, EMAIL
      from personas
      where NOMBRE like '"%' || :NOMBREI || '%"'
      into :NOMBREO, :APELLIDOSO, :EMAILO;
      
      suspend;
    end /*Fin NOMBRE*/
    else
    begin
      /*APELLIDOS*/
      if (not APELLIDOSI is null) then
      begin
        select NOMBRE, APELLIDOS, EMAIL
        from personas
        where APELLIDOS like '"%' || :APELLIDOSI || '%"'
        into :NOMBREO, :APELLIDOSO, :EMAILO;
        
        suspend;
      end /*Fin APELLIDOS*/
      else
        exception SIN_DATOS;
    end
  end /*Fin NOMBRE Y APELLIDOS*/

END
Ya he realizado los pasos que me comentas, el código que he colocado es este:

Código Delphi [-]
  if btn_Conexion.Caption = '&Conectar' then
  begin
    DataBase_FB.Open;
    DataSet_FB.Open;
    btn_Conexion.Caption := '&Desconectar';

    DataSetProc_FB.Open;
    Proc_FB.ParamByName('NOMBREI').AsString := ed_Nombre.Text;
    Proc_FB.ParamByName('APELLIDOSI').AsString := ed_Apellidos.Text;
    Proc_FB.ExecProc;
  end
  else
  begin
    DataBase_FB.Close;
    DataSet_FB.Close;
    btn_Conexion.Caption := '&Conectar';

    DataSetProc_FB.Close;
  end

Como apenas comienzo a codificar procedimientos quizas esté mal en la sintaxis o algo por el estilo.

El error que me manda al abrir la conexión y ejecutar la consulta es este:

Cita:
Field "3" not found.
Espero que me puedan decir que es lo que está pasando, ya intente quitar datos, campos y nada. La tabla a consultar tiene la siguiente información de estructura:

TABLA: Personas

NOMBRE varchar(40)
APELLIDOS varchar(40)
TELEFONO varchar(20)
EMAIL varchar(100)

Desde ya les doy las gracias por anticipado.
Responder Con Cita
  #10  
Antiguo 16-01-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
Hola, soy yo de nuevo. He resuelto el problema, no como yo lo quisiera pero me ha funcionado hasta que encuentre una solución.

He utilizado un objeto IBQuery y realizado una consulta al procedimiento y listo. Digamos algo así:

Código Delphi [-]
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.ADD('SELECT * FROM nombre del procedimiento(param1, param2, ..., paramx)');
  IBQuery.ParamByNAme('Param1').asString := ed_Nombre.Text;
  IBQuery.ParamByNAme('Param2').asString := ed_Apellidos.Text;
  ...

  IBQuery.Open;

Así es como lo he resuelto, pero me gustaría saber si alguien conoce otra forma utilizando el objeto IBStoreProc.

Nos leeremos luego...
Responder Con Cita
  #11  
Antiguo 16-01-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
En realidad esta me parece la forma mas adecuada de usar los procedimientos que devuelven un cursor..

Saludos.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #12  
Antiguo 16-01-2006
Ricardojosep Ricardojosep is offline
Miembro
 
Registrado: sep 2003
Ubicación: Sgo del estero (Argentina)
Posts: 75
Poder: 21
Ricardojosep Va por buen camino
Hola cuburu,
Copie tu codigo y lo ejecute con una base que tengo en mi PC. Aqui te mando el codigo de nuevo con unas modificaciones, lo que te paso aqui funciona a la perfeccion.

Código Delphi [-]
if btn_Conexion.Caption = '&Conectar' then
  begin
    MDODatabase1.Open;
    btn_Conexion.Caption := '&Desconectar';

    MDOStoredProc1.ParamByName('IP').AsString := Edit1.Text;
    MDOStoredProc1.ExecProc;
    ShowMessage(IntToStr(MDOStoredProc1.Params.Items[0].Value));
  end
else
  begin
    MDODatabase1.Close;
    btn_Conexion.Caption := '&Conectar';
  End;

La unica diferencia es que saco los DataSets que tienes tu y bueno utilizo los MDO para conectarme.
Veras que muestro un mensaje, eso es para ver si me entregaba el valor nada mas.
En fin, espero que te sirva, no se cual puede ser tu error, pero el ejemplo que te envio funciona.

Suerte. Saludos!!!
__________________
La amistad es la union de dos almas para formar una sola.
Responder Con Cita
  #13  
Antiguo 17-01-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
Gracias Ricardojosep, Hare la prueba el fin de semana, debido a que me encuentro trabajando fuera y solo tengo chance de hacerlo en esos días.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Delphi no toma los Registros Modificados de Firebird Ricardojosep Firebird e Interbase 2 12-01-2006 15:05:44
filtrar datos desde delphi 6 el_barto Impresión 1 06-01-2006 17:42:05
Acceso a firebird desde Delphi 2005.net hibero Firebird e Interbase 1 26-12-2005 16:48:34
Con delphi Insert en Firebird varios registros desde otra tabla lasweb Conexión con bases de datos 3 04-04-2005 20:58:26
Generar una DB en Firebird desde Delphi RONPABLO Conexión con bases de datos 1 22-10-2004 09:58:28


La franja horaria es GMT +2. Ahora son las 08:29:03.


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