PDA

Ver la Versión Completa : Problema con insert


Ivan_25
03-11-2005, 21:49:38
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

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....

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.

Insert.... --etc
Values(...); -- punto y coma????? seguro?????


no recuerdo si el Add agrega al final del texto o agrega una nueva lineacada 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
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
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:


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
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
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
ADOQInsertar->SQL->Add("INSERT INTO candidatos(Id,Nombre) VALUES('"+ECodigo->Text.Trim()+"','"+ENombre->Text.Trim()+"')");

Gracias a tod@s