Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   tAdoStoredProc, manejo de parametros (https://www.clubdelphi.com/foros/showthread.php?t=92394)

arturoio 18-10-2017 22:13:37

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

Casimiro Notevi 18-10-2017 22:18:18

¿Y la sentencia sql insert?

arturoio 18-10-2017 22:36:04

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

Casimiro Notevi 19-10-2017 00:01:12

Bien, pues el procedimiento almacenado ;)

arturoio 19-10-2017 18:02:39

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

orodriguezca 20-10-2017 17:30:27

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)

arturoio 20-10-2017 19:12:14

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?

Casimiro Notevi 20-10-2017 19:42:56

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.

arturoio 20-10-2017 19:54:22

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.

Casimiro Notevi 20-10-2017 19:56:18

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.

orodriguezca 20-10-2017 23:58:38

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.

arturoio 23-10-2017 18:45:59

Cita:

Empezado por orodriguezca (Mensaje 521900)
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?

orodriguezca 24-10-2017 03:59:13

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.

arturoio 24-10-2017 18:43:55

Cita:

Empezado por orodriguezca (Mensaje 521960)
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 :(

arturoio 06-11-2017 18:32:15

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 :D


La franja horaria es GMT +2. Ahora son las 02:49:10.

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