Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problema con insert (https://www.clubdelphi.com/foros/showthread.php?t=26806)

Ivan_25 03-11-2005 21:49:38

Problema con insert
 
Hola a tod@s!. Tengo un problemilla al hacer un insert. El codigo que tengo es el siguiente:

ADOQInsertar->SQL->Clear();
ADOQInsertar->SQL->Add("INSERT INTO candidatos(Nombre)");
ADOQInsertar->SQL->Add("VALUES("+ENombre->Text.Trim()+");");
cadena = ADOQInsertar->SQL->Text.Trim();
Edit1->Text = cadena;
ADOQInsertar->ExecSQL();
ADOQInsertar->Active = true;
FPrincipal->DBGCandidatos->DataSource = DSInsertar;

Al insertar me da un error que dice que ENombre no tiene valores por defecto (¿?¿?¿?¿?). Si inserto tambien el Id, que es la clave, me dice que no puede porque crearia valores duplicados, y sin embargo, ese id no esta en la base de datos. ¿Podeis ayudarme?

OSKR 03-11-2005 22:28:01

yo empezaria por
Código:

ADOQInsertar->SQL->Clear();
ADOQInsertar->SQL->Add("INSERT INTO candidatos(Nombre) VALUES("+ENombre->Text.Trim()+");");
cadena = ADOQInsertar->SQL->Text.Trim();
Edit1->Text = cadena;
ADOQInsertar->ExecSQL();
ADOQInsertar->Active = true;
FPrincipal->DBGCandidatos->DataSource = DSInsertar;

unir las lineas de la sentencia, ya q no recuerdo si el Add agrega al final del texto o agrega una nueva linea, otra cosa...no veo el Id, el primer error q mencionas es raro, pero antes de insertar yo me aseguraria q la longitud del ENombre->Text.Trim() fuera distinta de 0 xq sino estaria mandando una cadena nula.........ves :eek:?, otra mas.........creo q deberias encerrar entre comillas o comillas dobles el nombre (xq supogo q es una cadena), seria algo asi....
Código:

ADOQInsertar->SQL->Add("INSERT INTO candidatos(Nombre) VALUES('"+ENombre->Text.Trim()+"');");
//o asi....
ADOQInsertar->SQL->Add("INSERT INTO candidatos(Nombre) VALUES(\""+ENombre->Text.Trim()+"\");");

dependiendo de tu BD, hay algunas q aceptan de las 2, suerte

ContraVeneno 03-11-2005 23:22:30

no se si sea porque es en Builder, pero siguiendo mi poco conocimiento de la matería: no logro entender porque al final de la secuencia SQL le agregas un punto y coma. Al menos a mi me parece extraño.
Código SQL [-]
Insert.... --etc
Values(...); -- punto y coma????? seguro?????

Cita:

Empezado por OSKR
no recuerdo si el Add agrega al final del texto o agrega una nueva linea

cada instruccción Add es una nueva línea en la instrucción SQL.

Coincido con el detalle de las comillas al momento de pasar el nombre...

Ivan_25 04-11-2005 09:04:18

No me funciona
 
He probado este codigo para insertar el Id, pero me dice que crearia campos duplicados y me da error, aunque sin embargo lo inserta en la base de datos:

String cadena;
FPrincipal->ADOQListacandidatos->SQL->Clear(
FPrincipal->ADOQListacandidatos->SQL->Add("INSERT INTO candidatos (Id) VALUES(\""+ECodigo->Text.Trim()+ "\")");
cadena = FPrincipal->ADOQListacandidatos->SQL->Text.Trim();
Edit1->Text = cadena;
FPrincipal->ADOQListacandidatos->ExecSQL();
FPrincipal->ADOQListacandidatos->Active = true;
FPrincipal->DBGCandidatos->DataSource = FPrincipal->DSListacandidatos;

¿Se os ocurre algo?

alt126 04-11-2005 09:14:22

puess....
 
personalmente creo que es por el "ECodigo->Text"...., lo del ; esta bien. Esto es porque para pasar parametros a una consulta, no se puede meter en la cadena de la consulta un componente...solo se puede poner SQL!!!

para meter un parametro es asi:

Cita:

Datos->Consulta->SQL->Clear();
Datos->Consulta->SQL->Add("SELECT Campo1 FROM Tabla WHERE Campo2=:a;");
Datos->Consulta->Params->Items[0]->AsString = "lo que quieras";
...
Prueba eso a ver que tal. Porque el componente Edit ese que metes, yo creo que lo toma como una cadena de texto y no como un componente...de todas maneras te vuelvo a comentar, que las consultas, las pruebes antes en la BD, y cuando veas que es correcto lo que hace, la metas en codigo...te ahorraras muchos dolores de cabeza.

Un saludo

Antonio

Ivan_25 04-11-2005 09:16:25

Localizado el problema
 
El problema esta en el active:

FPrincipal->ADOQListacandidatos->Active = true;

Si lo quito lo inserta bien y no da fallo, pero el problema es que entonces al volver a mostrar el formulario principal no me muestra los registros, y si pongo el active me da fallo. ¿Como puedo solucionarlo?. Gracias por todo. ;)

Ivan_25 04-11-2005 10:30:51

Lo he solucionado asi
 
ADOQInsertar->SQL->Clear();
ADOQInsertar->SQL->Add("INSERT INTO candidatos(Id) VALUES(\""+ECodigo->Text.Trim()+"\")");
FPrincipal->DSListacandidatos->DataSet = ADOQInsertar;
ADOQInsertar->ExecSQL();
//ADOQInsertar->Active = true; //Esta queda inactiva
FPrincipal->DSListacandidatos->DataSet = ADOQInsertar;
FPrincipal->ADOQListacandidatos->Active = true;
FPrincipal->DSListacandidatos->DataSet = FPrincipal->ADOQListacandidatos;
FPrincipal->ADOQListacandidatos->Close();

Y cuando cierro el formulario hago:

FPrincipal->ADOQListacandidatos->Open();

El problema que tengo ahora es que no se como hacer para insertar dos campos a la vez, es decir:

ADOQInsertar->SQL->Add("INSERT INTO candidatos(Id,Nombre) VALUES(\""+ECodigo->Text.Trim()+" Segundo campo \")");

porque he probado con \"," y todo eso me da fallo. Un saludo.

Ivan_25 04-11-2005 10:38:34

Solucionado
 
ADOQInsertar->SQL->Add("INSERT INTO candidatos(Id,Nombre) VALUES('"+ECodigo->Text.Trim()+"','"+ENombre->Text.Trim()+"')");

Gracias a tod@s


La franja horaria es GMT +2. Ahora son las 17:11:00.

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