PDA

Ver la Versión Completa : Duda con Consulta C++ y Mysql


LuisMiguel
11-08-2012, 21:20:13
Saludos amigos, tengo algunos problemas con una consulta que estoy haciendo desde C++ hacia Mysq
Para comenzar la conexion de C++ a Mysql lo realizo perfectamente, el problema esta cuando quiero obtener unos de los datos desde la BD
String Nombre = nombre->Text;
String Proteinas = proteinas->Text;
String Carbohidratos = carbohidratos->Text;
String Grasas = grasas->Text;
String Fibra = fibra->Text;
//buscar a ver si existe el Grano
Form3->GuardarPorcentajes->Close();
Form3->GuardarPorcentajes->SQL->Clear();
Form3->GuardarPorcentajes->SQL->Add("SELECT granosporcentajes.Nombre FROM granosporcentajes where Nombre=:Nombre");
Form3->GuardarPorcentajes->Parameters->ParamByName("Nombre")->Value=Nombre;
Form3->GuardarPorcentajes->Open();
String NombreEcontrado=Form3->GuardarPorcentajes->FieldByName("idGrano")->Value;
De esta forma me da error
Form3->GuardarPorcentajes->SQL->Add("SELECT granosporcentajes.Nombre FROM granosporcentajes where Nombre=:Nombre");En Access lo hacia como en la linea anterior
Lo cambie para
Form3->GuardarPorcentajes->SQL->Add("SELECT granosporcentajes.Nombre FROM granosporcentajes where Nombre='Nombre');Y trabaja pero me da error en la siguiente linea
Form3->GuardarPorcentajes->Parameters->ParamByName("Nombre")->Value=Nombre;raised exception class edatabaseerror with message 'GuardarPorcentajes:Parameter'Nombre' not found'
Otra cosa es que si para obtener un campo de la BD lo puedo hacer asi como en access
String NombreEcontrado=Form3->GuardarPorcentajes->FieldByName("idGrano")->Value;Saludos a todos.

LuisMiguel
12-08-2012, 18:16:43
Saludos amigos, el problema lo resolvi, no creo que sea la forma mas optima pero al menos trabaja, si alguien me da una mejor sera bienvenida.

String Nombre = nombre->Text;
String Proteinas = proteinas->Text;
String Carbohidratos = carbohidratos->Text;
String Grasas = grasas->Text;
String Fibra = fibra->Text;
String Nombregrano="'"+ Nombre +"'";
//buscar a ver si existe el Grano
Form3->GuardarPorcentajes->Close();
Form3->GuardarPorcentajes->SQL->Clear();
String Consulta = "SELECT * FROM granosporcentajes where granosporcentajes.Nombre="+Nombregrano;
Form3->GuardarPorcentajes->SQL->Add(Consulta);
Form3->GuardarPorcentajes->Open();
String NombreEcontrado=Form3->GuardarPorcentajes->FieldByName("idGrano")->Value;
Primero el nombre que recibo de
String Nombre = nombre->Text; lo pongo dentro de dos comillas simples
String Nombregrano="'"+ Nombre +"'";Y elimino la parte de
Form3->GuardarPorcentajes->Parameters->ParamByName("Nombre")->Value=Nombre;

ecfisa
12-08-2012, 23:43:06
Hola LuisMiguel.

Aunque no mencionas los componentes que usas para conectarte, infiero por Parameters que son ADO. Si es así, este código tendría que funcionarte sin problemas:

{
TADOQuery *Qry = static_cast<TADOQuery*>(Form3->GuardarPorcentajes);
...
Qry->Close();
Qry->SQL->Clear();
Qry->SQL->Add("SELECT * FROM GRANOSPORCENTAJES ");
Qry->SQL->Add("WHERE NAME= :PGRANO");
Qry->Parameters->ParamByName("PGRANO")->Value = Nombregrano;
Qry->Open();
...


Saludos.

LuisMiguel
13-08-2012, 02:23:59
Saludos ecfisa (http://www.clubdelphi.com/foros/member.php?u=7718)
Los componentes que usé fueron ADO.
De la forma que usted me dice lo probe varias veces y no me funcionó, me da los errores que mencioné al principio.
Gracias por responder

ecfisa
13-08-2012, 05:47:46
Hola LuisMiguel.

No se que puede estar sucediendo... :confused:

De todos modos, dejando de lado la seguridad (Inyección SQL (http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL)), el código

String Nombre = nombre->Text;
String Nombregrano="'"+ Nombre +"'";
...
String Consulta = "SELECT * FROM granosporcentajes where granosporcentajes.Nombre="+Nombregrano;
...
...->SQL->Add(Consulta);

funciona del mismo modo que con parámetros.


Si bién se podría ahorrar código de este modo:

...
...->SQL->Text = "SELECT * FROM granosporcentajes where granosporcentajes.Nombre=" + QuotedStr(nombre->Text);


Saludos.

LuisMiguel
13-08-2012, 16:53:16
Saludos ecfisa
Gracias por la aclaración, no sabia eso de QuotedStr. En el caso de la seguridad como podría proteger el código contra la Inyección SQL, lo he hecho en php pero en C++ no.

ecfisa
13-08-2012, 18:26:24
Saludos ecfisa
Gracias por la aclaración, no sabia eso de QuotedStr. En el caso de la seguridad como podría proteger el código contra la Inyección SQL, lo he hecho en php pero en C++ no.
Hola LuisMiguel.

Se evita totalmente con el uso de parámetros.

No sé por que no te esta funcionando con parámetros, tal vez sean versiones... no sé. Te convendría exponer el problema (de MySQL con ADO) en el foro de MySQL donde seguramente encuentres respuesta.

Saludos. :)

roman
13-08-2012, 19:40:44
No sé por que no te esta funcionando con parámetros,

No estoy muy seguro, pero creo que se debe a que en ADO, a diferencia de otros componentes similares, el objeto Parameter no tiene propiedades del tipo AsString, AsInteger, etc. así que los valores se pasan mediante el variant Parameter.Value. Supongo que por eso, ADO pasa el valor tal cual sin encerrar el valor entre comillas.

Si no mal recuerdo, eso se solventa especificando explícitamente el tipo de datos del parámetro con Parameter.DataType (en este caso sería ftString).

Por otra parte, uno de los intentos de LuisMiguel


Form3->GuardarPorcentajes->SQL->Add("SELECT granosporcentajes.Nombre FROM granosporcentajes where Nombre='Nombre');


que le dió por error:

Parameter'Nombre' not found'

puede deberse a que faltaron los dos puntos:


Form3->GuardarPorcentajes->SQL->Add("SELECT granosporcentajes.Nombre FROM granosporcentajes where Nombre=':Nombre');



Quizá, así sí funcione.

// Saludos