Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-10-2017
arturoio arturoio is offline
Miembro
NULL
 
Registrado: oct 2017
Posts: 17
Poder: 0
arturoio Va por buen camino
tAdoStoredProc, manejo de parametros

Estoy trabajando con Este elemento de un procedimiento almacenado que me realiza una inserción. Trabajando desde el gestor de BD no tengo ningun problema el SP realiza su trabajo.
Pero al hacerlo desde c++ builder me estan generando conflicto los parametros, ya que le esta dando valores que no le corresponden a un atributo en especifico.

Asigno los valores de la siguiente forma:

Código:
                DM1->ADOSP1->Close();
                DM1->ADOSP1->Parameters->ParamByName("identificador")->Value = "abc123";
                DM1->ADOSP1->Parameters->ParamByName("nombre")->Value = nombre;
                DM1->ADOSP1->Parameters->ParamByName("apellidoP")->Value = apellidoP;
                DM1->ADOSP1->Parameters->ParamByName("apellidoM")->Value =  apellidoM;
                DM1->ADOSP1->Parameters->ParamByName("fecha")->Value = fecha;
                DM1->ADOSP1->Parameters->ParamByName("telefono")->Value = telefono;
                DM1->ADOSP1->Parameters->ParamByName("celular")->Value = celular;
                DM1->ADOSP1->Parameters->ParamByName("pais")->Value = pais;
                DM1->ADOSP1->Parameters->ParamByName("estado")->Value = estado;
                DM1->ADOSP1->Parameters->ParamByName("ciudad")->Value = ciudad;
                DM1->ADOSP1->Parameters->ParamByName("colonia")->Value = colonia;
                DM1->ADOSP1->Parameters->ParamByName("calle")->Value = calle;
                DM1->ADOSP1->Parameters->ParamByName("numero")->Value = numero;
                DM1->ADOSP1->Parameters->ParamByName("profesion")->Value = profesion;
                DM1->ADOSP1->Parameters->ParamByName("estadoC")->Value = civil;
                DM1->ADOSP1->Parameters->ParamByName("escolaridad")->Value = escolaridad;
                DM1->ADOSP1->Parameters->ParamByName("sexo")->Index  = sexo;
                DM1->ADOSP1->Parameters->ParamByName("sangre")->Value = sangre;
                DM1->ADOSP1->Parameters->ParamByName("correo")->Value = correo;

                DM1->ADOSP1->Prepared;
                DM1->ADOSP1->Open();
Previamente asigno los valores a las variables de la siguiente forma:

Código:
 nombre = txNombre->Text.Trim();
      apellidoP = txApellidoP->Text.Trim();
      apellidoM = txApellidoM->Text.Trim();
      fecha = dpFecha->Date.FormatString("yyyy-mm-dd");
      telefono = txTelefono->Text ;
      celular = txCelular->Text ;
      correo = txCorreo->Text ;
      calle = cbCalle->KeyValue  ;
      numero = txNumero->Text;
      colonia = cbColonia->KeyValue ;
      ciudad = cbCiudad->KeyValue  ;
      estado = cbEstado->KeyValue;
      pais = cbPais->KeyValue;
      profesion = txProfesion->Text;
      escolaridad = cbEscolaridad->Text;
      civil = txEstCivil->Text;
      sangre = cbSangre->Text ;
He corrido la aplicación paso a paso y las variables tienes los valores correctos pero a pesar de eso se ocaciona el siguiente error

Cita:
incorrect date value 'martinez' for colum 'fecha'...
al parecer porque asigna el valor del apellidoM al parametro fecha y así susesivamente con otros parametros.

De antemano muchas gracias
Responder Con Cita
  #2  
Antiguo 18-10-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y la sentencia sql insert?
Responder Con Cita
  #3  
Antiguo 18-10-2017
arturoio arturoio is offline
Miembro
NULL
 
Registrado: oct 2017
Posts: 17
Poder: 0
arturoio Va por buen camino
Como comentaba es un procedimiento almacenado. Por eso uso el TAdoStoredProc y así solo le envio los parametros y desde el inspector de propiedades le indico a cual procedimiento almacedo de la BD corresponde
Responder Con Cita
  #4  
Antiguo 19-10-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bien, pues el procedimiento almacenado
Responder Con Cita
  #5  
Antiguo 19-10-2017
arturoio arturoio is offline
Miembro
NULL
 
Registrado: oct 2017
Posts: 17
Poder: 0
arturoio Va por buen camino
Código SQL [-]
Delimiter $$
DROP PROCEDURE IF EXISTS insertaPaciente;
    CREATE PROCEDURE insertaPaciente (identificador VARCHAR(12), nombre VARCHAR(45), apellidoP VARCHAR(45), apellidoM VARCHAR(45), fecha DATE, telefono VARCHAR(15), celular VARCHAR(15),
    pais INT, estado int, ciudad int, colonia int, calle int, numero VARCHAR(7), profesion VARCHAR(45), estadoC VARCHAR(15), escolaridad VARCHAR(45), sexo int, sangre VARCHAR(2), correo VARCHAR(70)) ##Se definen los parametros que necesitara el SP
    
    BEGIN #Inicia las intrucciones para el SP
    DECLARE direccion INT; #Declaramos una variable y a continuación comprobaremos si ya existe un registro igual
    SET direccion = (Select count(cl08_Id) from cl08 where cl14_Id = pais and cl13_Id = estado and cl12_Id = ciudad and cl09_Id = calle and cl11_Id = colonia and cl08_Numero = numero);
    
    IF direccion = 0 # a traves de este if decidimos si se inserta un nuevo registro o se utiliza el que ya existe
    THEN
        INSERT INTO cl08 values (null,calle,colonia,numero,ciudad,estado,pais);
    END IF;    
    
    SET direccion = (Select cl08_Id from cl08 where cl14_Id = pais and cl13_Id = estado and cl12_Id = ciudad and cl09_Id = calle and cl11_Id = colonia and cl08_Numero = numero);
    insert into cl00 values (null,identificador, nombre, apellidoP, apellidoM, fecha, telefono, celular, profesion, estadoC,escolaridad, sexo, sangre, correo, direccion); # Hacemos nuestra inserción 

END $$

Este es el SP. Desde el gestor de la Base de datos funciona sin problemas
Responder Con Cita
  #6  
Antiguo 20-10-2017
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
Solo por ensayar, cambia la sentencia insert del procedimiento almacenado y coloca de forma explicita las columnas a afectar:

Código SQL [-]
insert into c100(nombreCol1, nombreCol2, ... etc) values (null, identificador, nombre, apellidoP.. ect)
Responder Con Cita
  #7  
Antiguo 20-10-2017
arturoio arturoio is offline
Miembro
NULL
 
Registrado: oct 2017
Posts: 17
Poder: 0
arturoio Va por buen camino
Muchas gracias orodriguezca. Ya lo intente y aun nada.
Lo que me parece aun más extraño es que ya intente modificar y eliminar desde este mismo proyecto y lo realiza sin ningun problema

Alguna otra idea?
Responder Con Cita
  #8  
Antiguo 20-10-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Sigue paso a paso el código, y mira los valores que reciben los parámetros, al igual que el orden de ellos.
Es algo trivial, pero hay que tener mucha paciencia.
Responder Con Cita
  #9  
Antiguo 20-10-2017
arturoio arturoio is offline
Miembro
NULL
 
Registrado: oct 2017
Posts: 17
Poder: 0
arturoio Va por buen camino
Cita:
Sigue paso a paso el código, y mira los valores que reciben los parámetros, al igual que el orden de ellos.
Es algo trivial, pero hay que tener mucha paciencia.
Casimiro Notevi Sabes alguna forma de hacer debug en la Base de datos, para comprobar exactamente que esta recibiendo mi SP. He analizado los valores que se envian desde el IDE y todo parece estar bien.Y las pruebas que hecho de insertar desde el progpio gestor de Base de datos no arrojan ningun problema.
Responder Con Cita
  #10  
Antiguo 20-10-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Para empezar pon un breakpoint en tu código, justo en el momento que llama al SP, y mira los valores que tengan los parámetros.
Responder Con Cita
  #11  
Antiguo 20-10-2017
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
Verifica que el orden de los parámetros en DM1->ADOSP1 sea realmente el orden y cantidad de parámetros esperado por el procedimiento almacenado insertaPaciente. Hay que tener en cuenta que en SQL Server a todo procedimiento almacenado le adiciona un primer parámetro en la posición cero de tipo ptResult y nombre Result; quizás falta ese parámetro en la definición de DM1->ADOSP1.
Responder Con Cita
  #12  
Antiguo 23-10-2017
arturoio arturoio is offline
Miembro
NULL
 
Registrado: oct 2017
Posts: 17
Poder: 0
arturoio Va por buen camino
Cita:
Empezado por orodriguezca Ver Mensaje
Verifica que el orden de los parámetros en DM1->ADOSP1 sea realmente el orden y cantidad de parámetros esperado por el procedimiento almacenado insertaPaciente. Hay que tener en cuenta que en SQL Server a todo procedimiento almacenado le adiciona un primer parámetro en la posición cero de tipo ptResult y nombre Result; quizás falta ese parámetro en la definición de DM1->ADOSP1.
Gracias orodriguezca, estoy utilizando MariaDB, aunque lo que me comentas pareciera explicar el problema que estoy teniendo. He estado investigando y al parecer no hay una función equivalente mariadb. Sabes si hay alguna función que realice esto o si se deba dar alguna propiedad adicional al SP al realizar la inserción?
Responder Con Cita
  #13  
Antiguo 24-10-2017
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
No se porque razón asumí que el motor de bases de datos era SQL SERVER. En MariaDB esto no debería ocurrir, pues solo tiene parámetros IN, OUT y INOUT.

Probemos un par de ideas diferentes:

- Colocar DM1->ADOSP1->Prepared antes de asignarle valores a los parámetros. No creo que ese sea el problema pero...
- En vez de utilizar DM1->ADOSP1->Open() utiliza DM1->ADOSP1->ExceProc(). Ya que el procedimiento almacenado no está devolviendo un conjunto de resultados no tiene sentido usar el método Open(); lo correcto, en este caso, es usar el método ExecProc.
Responder Con Cita
  #14  
Antiguo 24-10-2017
arturoio arturoio is offline
Miembro
NULL
 
Registrado: oct 2017
Posts: 17
Poder: 0
arturoio Va por buen camino
Cita:
Empezado por orodriguezca Ver Mensaje
No se porque razón asumí que el motor de bases de datos era SQL SERVER. En MariaDB esto no debería ocurrir, pues solo tiene parámetros IN, OUT y INOUT.

Probemos un par de ideas diferentes:

- Colocar DM1->ADOSP1->Prepared antes de asignarle valores a los parámetros. No creo que ese sea el problema pero...
- En vez de utilizar DM1->ADOSP1->Open() utiliza DM1->ADOSP1->ExceProc(). Ya que el procedimiento almacenado no está devolviendo un conjunto de resultados no tiene sentido usar el método Open(); lo correcto, en este caso, es usar el método ExecProc.
Probe estas recomendaciones y aun nada. Ninguna de las alternativas parece funcionar
Responder Con Cita
  #15  
Antiguo 06-11-2017
arturoio arturoio is offline
Miembro
NULL
 
Registrado: oct 2017
Posts: 17
Poder: 0
arturoio Va por buen camino
Smile Solucion

Por si a alguien le hace falta en el futuro.
No pude encontrar la causa de el error que mencionaba, incluso volví a hacer otro proyecto y me daba el mismo error, lo curioso es que en otro proyecto que realice utilizando SP me funciono sin problemas, no se si tiene que ver el número de parametros.
En fin lo que hice para que funcionara fue utilizar el elemento TADOQuery, e hice una llamada a mi SP " call nombreStoreProc(Parametros) " y fue de esta manera en que solucione este problema

Gracias a todos los que colaborarón con sus opiniones
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
direction en TADOStoredProc !! Confucio SQL 2 18-10-2007 15:43:41
Manejo de parametros en sql zvf SQL 3 13-09-2007 17:09:49
Problemas con TADOStoredProc david.rguez Conexión con bases de datos 0 02-07-2006 20:52:23
TADOStoredProc & DBLookupComboBox TriLoCBA Conexión con bases de datos 0 23-09-2005 16:55:52
Locate de TADOStoredProc arantzal Varios 0 09-02-2005 17:19:20


La franja horaria es GMT +2. Ahora son las 12:10:22.


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