Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Duda con Consulta C++ y Mysql (https://www.clubdelphi.com/foros/showthread.php?t=79805)

LuisMiguel 11-08-2012 21:20:13

Duda con Consulta C++ y Mysql
 
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
Código:

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
Código:

Form3->GuardarPorcentajes->SQL->Add("SELECT granosporcentajes.Nombre FROM granosporcentajes where Nombre=:Nombre");
En Access lo hacia como en la linea anterior
Lo cambie para
Código:

Form3->GuardarPorcentajes->SQL->Add("SELECT  granosporcentajes.Nombre FROM granosporcentajes where  Nombre='Nombre');
Y trabaja pero me da error en la siguiente linea
Código:

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
Código:

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.
Código:

  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
Código:

String Nombre = nombre->Text;
lo pongo dentro de dos comillas simples
Código:

String Nombregrano="'"+ Nombre +"'";
Y elimino la parte de
Código:

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:
Código:

{
  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
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), el código
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:
Código:

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

Cita:

Empezado por LuisMiguel (Mensaje 439469)
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

Cita:

Empezado por ecfisa (Mensaje 439474)
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

Código:

Form3->GuardarPorcentajes->SQL->Add("SELECT  granosporcentajes.Nombre FROM granosporcentajes where  Nombre='Nombre');
que le dió por error:

Cita:

Parameter'Nombre' not found'
puede deberse a que faltaron los dos puntos:

Código:

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

Quizá, así sí funcione.

// Saludos


La franja horaria es GMT +2. Ahora son las 07:30:52.

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