Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Error convirtiendo

Estas en el tema de Error convirtiendo en el foro de .NET en Foros del Web. Hola tengo un valor en un textbox y lo quiero guardar en la base de datos como entero, trato de convertirlo usando Convert.ToInt32 pero me ...
  #1 (permalink)  
Antiguo 04/06/2013, 15:11
 
Fecha de Ingreso: noviembre-2004
Ubicación: Medellín
Mensajes: 121
Antigüedad: 20 años, 1 mes
Puntos: 1
Busqueda Error convirtiendo

Hola tengo un valor en un textbox y lo quiero guardar en la base de datos como entero, trato de convertirlo usando Convert.ToInt32 pero me sale error diciéndome que Convert no existe. Este es el código:
string connStr = "server=localhost;user=root;database=bd_personas;p ort=3306;password=1234;";
MySqlConnection conn = new MySqlConnection(connStr);
string query = "INSERT INTO tbl_personas (id, nombres, apellidos) VALUES (Convert.ToInt32(texCedula.Text), 'Jhon', 'Hernandez')";
  #2 (permalink)  
Antiguo 04/06/2013, 16:53
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 7 meses
Puntos: 344
Respuesta: Error convirtiendo

No puedes usar métodos de C# dentro de consultas SQL. Lo que tienes que hacer es sacar la función de conversión fuera.

Con String.Format:
Código C:
Ver original
  1. string query = String.Format("INSERT INTO tbl_personas (id, nombres, apellidos) VALUES ({0},'{1}','{2}')", Convert.ToInt32(texCedula.Text), "Jhon", "Hernandez");

Como tú querías hacerlo, pero bien:
Código C:
Ver original
  1. string query = "INSERT INTO tbl_personas (id, nombres, apellidos) VALUES (" +  Convert.ToInt32(texCedula.Text) + "'Jhon', 'Hernandez')";
  #3 (permalink)  
Antiguo 04/06/2013, 18:08
 
Fecha de Ingreso: noviembre-2004
Ubicación: Medellín
Mensajes: 121
Antigüedad: 20 años, 1 mes
Puntos: 1
Respuesta: Error convirtiendo

Muchas gracias, pero me dice ahora que hay un error en la sintaxis de sql, en esa línea

Lo arreglé poniéndole comillas sencillas
'" + Convert.ToInt32(texCedula.Text) + "'

Última edición por yonerflash; 04/06/2013 a las 18:21
  #4 (permalink)  
Antiguo 04/06/2013, 20:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error convirtiendo

Dudo que lo arreglaras bien. Si te fijas con cuidado, el problema es que se generan dos datos y estás intentando insertar tres columnas.
Falta una coma de separación entre el primer dato (convertido) y el segundo (el nombre):
Código vb:
Ver original
  1. string query = "INSERT INTO tbl_personas (id, nombres, apellidos)
  2. VALUES (" +  Convert.ToInt32(texCedula.Text) + ", 'Jhon', 'Hernandez')";
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 05/06/2013, 01:34
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 11 meses
Puntos: 606
Respuesta: Error convirtiendo

Ninguna de las soluciones es "buena" xD

Veamos, tenemos una cadena de texto (un textbox) que contiene un número. Y quieres pasarlo a número para luego pasarlo a cadena ya que lo estas concatenando en la query... No tiene mucho sentido.

Soluciones que yo usaría:

Código C:
Ver original
  1. string query = "INSERT INTO tbl_personas (id, nombres, apellidos) VALUES (" +  texCedula.Text + ", 'Jhon', 'Hernandez')";

Código C:
Ver original
  1. string query = String.Format("INSERT INTO tbl_personas (id, nombres, apellidos) VALUES ({0}, 'Jhon', 'Hernandez')", texCedula.Text);

E incluso usando un StringBuilder, pero hacer la conversión a entero en este caso no tiene ningún sentido.
__________________
Aviso: No se resuelven dudas por MP!
  #6 (permalink)  
Antiguo 05/06/2013, 04:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error convirtiendo

Personalmente, prefiero usar parametrizaciones de las consultas.
¿no sería algo mejor?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 05/06/2013, 04:26
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 11 meses
Puntos: 606
Respuesta: Error convirtiendo

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Personalmente, prefiero usar parametrizaciones de las consultas.
¿no sería algo mejor?
Lo ideal efectivamente sería usar un store procedure y pasarle los parametros.

De todas formas si analizamos lo que hace el insert no tiene mucho sentido. El ID tendría que ser PK y autoincremental, almenos yo lo haría así, de forma que solo "insertas" nombre y apellidos.
__________________
Aviso: No se resuelven dudas por MP!
  #8 (permalink)  
Antiguo 05/06/2013, 05:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error convirtiendo

No hace falta exactamente un SP para usar parametrizaciones en una query. Basta con poner los parámetros con que se reemplazará.
Supongamos este ejemplo:
Código vb:
Ver original
  1. string query = "INSERT INTO tbl_personas (id, nombres, apellidos) VALUES (@cedula, @nom, @ape)";
  2. MySqlCommand cmd = new MySqlCommand(query, conn);
  3. cmd.Parameters.AddWithValue("@cedula", Convert.ToInt32(texCedula.Text));
  4. cmd.Parameters.AddWithValue("@nom", "John");
  5. cmd.Parameters.AddWithValue("@ape", "Hernandez");
En esencia, la parametrización es aplicable a cualquier objeto MysqlCommand. El uso de los mismos en el caso de los SP es habitual, pero no es exclusivo.
Esto implica mayor codificación, pero también más seguridad y control de tipos, así como detectar mejor las excepciones que se produzcan por errores de dato.

MySQL Reference Manual:: MysqlCommand
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 05/06/2013, 07:29
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 11 meses
Puntos: 606
Respuesta: Error convirtiendo

Lo del SP lo decía porque, aunque en este caso no sería aplicable, el gestor de BBDD compila el plan de ejecución la primera vez y las siguientes llamadas (en teoría) son más optimas. Además, no se en MySQL pero en SQL Server puedes usar el comando "Optimize for" para que cree un plan de ejecución optimo para unos valores en especial (los que más se consulten, por ejemplo).
__________________
Aviso: No se resuelven dudas por MP!
  #10 (permalink)  
Antiguo 05/06/2013, 08:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Error convirtiendo

Lo pensé, pero al mirar qué conector usaba vi que era MySQL, entonces la cosa cambia.
En MySQL si bien se "compila" los SP, estos quedan en realidad almacenados en la tabla correspondiente, pero una cosa no elimina la otra. El conector es el que hace la conversión de datos, y está preparado para parametrizar tanto para SP como para consultas comunes.
Una diferencia esencial entre ambos DBMS es que en los SP los parámetros no se indican en el prototipo del SP como variables con "@". En MySQL van sin nada, porque la "@" está reservada a un tipo especial de variables, que no son sinónimo de las locales del SP.
Por supuesto que para mayor seguridad, es mejor usar SP, pero eso es una decisión de diseño.

Veremos que nos dice.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: convert, insert, mysql, textbox, validacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:35.