Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Error al ejecutar INSERT con parámetros (https://www.clubdelphi.com/foros/showthread.php?t=66603)

elaguna 03-03-2010 06:34:05

Error al ejecutar INSERT con parámetros
 
Qué tal.

Después de mucho tiempo de no programar estoy regresando al redil, y como era de esperarse me están ocurriendo cosas raras.

Tengo declarada una variable de tipo entero en la cual voy a guardar el número máximo de registros de una tabla e incrementar en 1, esto lo estoy haciendo con un Query.

Código Delphi [-]w_maximo : Integer; Query1.SQL.Clear; Query1.SQL.Add('select max(id_planti) from planti_corr'); Query1.Open; w_maximo := query1.RecordCount + 1; Query1.Close;



Ahora necesito guardar algunos datos con parámetros

Código Delphi [-]Query1.SQL.Clear; Query1.SQL.Add('insert into planti_corr (id_planti, nombre, archivo, tipo, descri) '); Query1.SQL.Add('values (:w_max, :w_nombre, :w_archivo, :w_tip, :w_descrip)'); Query1.ParamByName('w_max').AsInteger := w_maximo; Query1.ParamByName('w_nombre').AsString := edt_Titulo.Text; Query1.ParamByName('w_archivo').AsString := edt_Archivo.Text; Query1.ParamByName('w_tip').AsString := w_tipo; Query1.ParamByName('w_descrip').AsMemo := Trim(mem_Descrip.Text); Query1.ExecSQL;


Pero me manda el error "Type mismatch in expression"

Ya probé enviando cada uno de los campos y todos los campos tipo string, char, memo pasan bien los datos; pero la variable de tipo integer es la que me manda el error.

También probé enviando todas las variables y el parámetro 'w_max' con valor 2 (directo) y todo funciona bien, pero con la variable no.

Ojalá me haya explicado y puedan ayudarme, llevo 2 días con ese mismo problema.

Gracias de antemano a todos.

elaguna 03-03-2010 06:38:57

Perdón, algo malo paso con el post :-)
 
Una disculpa, algo malo pasó al momento de enviar el post, pero va de nuevo el código.

Código Delphi [-]
w_maximo : Integer;

Query1.SQL.Clear;   
Query1.SQL.Add('select max(id_planti) from planti_corr'); 
 Query1.Open; 
 w_maximo := query1.RecordCount + 1;  
Query1.Close;

Ahora necesito guardar algunos datos con parámetros

Código Delphi [-]
Query1.SQL.Clear;  
Query1.SQL.Add('insert into  planti_corr (id_planti, nombre, archivo, tipo, descri) '); 
  Query1.SQL.Add('values (:w_max, :w_nombre, :w_archivo, :w_tip,  :w_descrip)');  
Query1.ParamByName('w_max').AsInteger := w_maximo;
Query1.ParamByName('w_nombre').AsString := edt_Titulo.Text;
Query1.ParamByName('w_archivo').AsString := edt_Archivo.Text;
Query1.ParamByName('w_tip').AsString := w_tipo;
Query1.ParamByName('w_descrip').AsMemo := Trim(mem_Descrip.Text);
Query1.ExecSQL;

Pero me manda el error "Type mismatch in expression"

Ya probé enviando cada uno de los campos y todos los campos tipo string, char, memo pasan bien los datos; pero la variable de tipo integer es la que me manda el error.

También probé enviando todas las variables y el parámetro 'w_max' con valor 2 (directo) y todo funciona bien, pero con la variable no.

Ojalá me haya explicado y puedan ayudarme, llevo 2 días con ese mismo problema.

Gracias de antemano a todos.

Ñuño Martínez 05-03-2010 10:30:43

Me da noséqué dejar este mensaje sin contestar.:(

La verdad es que no tengo mucha idea porque hace años que no uso bases de datos con Delphi pero, ¿no hay alguna propiedad que permita "desactivar" los parámetros?

Ivanzinho 05-03-2010 17:09:57

¿As comprobado el valor de la variable w_máximo antes de la inserción?, porque puede ser que tenga un valor nulo, aunque por otra parte me extraña que un recordcount devuelva null. Pon un punto de interrupción y comprueba el valor para ver si con ese dato podemos sacar algo más.

Un saúdo.

elaguna 05-04-2010 20:51:23

Que tal.
Gracias por tu atención.

La variable w_maximo es de tipo entero, no se que pasa, pero lo solucioné de una forma no muy elegante pero de momento me sacó del apuro.

* Sigo haciendo la consulta para determinar el valor máximo
* Guardo los datos por medio de una Tabla
Table1.Insert
...
Table1.Post

Sé que no es lo recomendable pero urgía salir del problema, pero este persiste, ojalá puedan ayudarme.

Gracias

Casimiro Notevi 05-04-2010 21:14:39

Código:

w_maximo : Integer;

Query1.SQL.Clear; 
Query1.SQL.Add('select max(id_planti) from planti_corr');
Query1.Open;
w_maximo := query1.RecordCount + 1; 
Query1.Close;

No sé qué estás haciendo, pero en este select, w_maximo siempre
valdrá 2.
Independientemente de lo que haga el select, al ser un "max",
devuelve un registro con el valor max de id_planti.
Luego le sumas 1 a recordcount y recordcount siempre es 1, un
registro.

afunez2007 05-04-2010 21:35:58

esta deberia ir asi y no trabajar con el recordcount, para eso no necesitas sacar el maximo
Código Delphi [-]
w_maximo : Integer;
 Query1.Active:=False; 
Query1.SQL.Clear;   
Query1.SQL.Add('select max(id_planti) as maximo from planti_corr'); 
 Query1.Active:=True; 
 w_maximo := query1.fieldbyname('maximo').asinteger + 1;  
Query1.Active:=False;

Otra cosa es el tipo de campo, dependiendo el tipo de base de datos, por ejemplo en paradox no te permite guardar un integer en un campo declarado como smallint

Por el error que dices que te da, Type minsmatch esta normalmente asociado a este tipo de situaciones

Saludos


La franja horaria es GMT +2. Ahora son las 16:38:23.

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