none
Insertar un INT desde el visual studio C# a una tabla sql RRS feed

  • Pregunta

  • Mi problema es el Siguiente:

    Quiero insertar en una tabla de sql una variable int desde el Visual Studio el problema es que me da error y no se el porque, aun soy novato en esto y necesito ayuda.

    Tengo esto:

    public bool insertar_id(int id_monitor,string monitor)

    {

    con.open();

    cmd =  new SqlCommand("Insert into Monitor_Sitema(id_monitor,monitor) values("+id_monitor+",'"+monitor+"')",con);

    cmd.ExecuteNonQuery();

    con.Close();

    }

    y mi tabla esta compuesta por tres columnas

    ID primary key

    monitor varchar(30)

    id_monitor int

    quien pueda ayudarme se lo agradecere, eh buscado por internet pero no encuentro una respuesta concreta en si

    gracias

    Miguel

    viernes, 18 de enero de 2019 15:46

Respuestas

  •  me mandaron esto [...] lo probé y me funcionó

    Ese código funcionará, pero tiene un error. Hay dos formas de enviar sentencias a SQL: Una es parametrizándola y asignando valores a los parámetros. Y la otra (que no es en general recomendable, aunque funciona) es concatenando los valores en la sentencia. El código que te enviaron mezcla las dos cosas: concatena valores en la sentencia, pero luego añade valores para un parámetro que no se usa nunca. Aunque se ejecute sin error, no está bien hecho.

    La variante que concatena valores es la que has hecho en el último código:

    "Insert into Monitor_Sitema(id_monitor,monitor) values("+id_monitor+",'"+monitor+"')"

    Esto funciona, pero tiene varios inconvenientes: es vulnerable ante ataques de inyección de SQL, dará error si "monitor" contiene algún carácter reservado tal como una comilla, y poluciona el caché de procedimientos del servidor por ser una sentencia ad-hoc.

    La variante parametrizada es la que te ha escrito Leandro en otra respuesta. En este caso en la sentencia se añade un parámetro (que empieza por @) en cada uno de los sitios en los que hay que "insertar" un dato, y luego esos parámetros se añaden al command asignándoles el valor que les corresponda. Esto soluciona los problemas de la sentencia ad-hoc.


    EDITADO: Nótese que el "AddWithValue" solo resuelve los dos primeros inconvenientes, pero sigue polucionando el caché de procedimientos. Para evitar este último problema hay que agregar los parámetros con la variante larga (Add en lugar de AddWithValue) asignándoles una longitud concreta.
    martes, 22 de enero de 2019 18:31

Todas las respuestas

  • Así a simple vista tiene pinta de estar bien. Debe haber algún error en otro sitio no evidente, como por ejemplo en la cadena de conexión o en el nombre de la tabla o de los campos, o alguna restricción sobre la tabla.

    Acostúmbrate a no decir nunca en el foro que "me da error". Hay que decir cuál es el error. Copia el mensaje completo, exacto y detallado, indicando la línea en la que se produce (por ejemplo, no da igual que sea en el con.Open que en el cmd.ExecuteNonQuery). Leyendo el mensaje de error es probable que podamos aportarte una ayuda mucho más precisa que si solo dices "me da error".

    • Propuesto como respuesta Pedro Alfaro viernes, 18 de enero de 2019 19:28
    viernes, 18 de enero de 2019 17:08
  • Hola, puedes mostrar el mensaje de error completo? Gracias 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 18 de enero de 2019 20:12
  • muchas gracias por la aclaración.

    pero al parecer es que no puedo enviar el int directo al sql, me mandaron esto pero no me esplicaron bien, lo probé y me funcionó pero me molesta el no saber que hice al final, tienes alguna referencia sobre esto?, algo que me pueda ayudar a aprender a insertar valores mediate sql a C#. Te lo agradeceré si me ayudas con eso mano.

    public void insertar_id(int id_monitor,string monitor)

    {

    con.open();

    using(var comando =  new SqlCommand("Insert into Monitor_Sitema(id_monitor,monitor) values("+id_monitor+",'"+monitor+"')",con)

    {

    comando.Parameters.AddWithValue("@id_monitor",id_monitor)

    comando.ExecuteNonQuery();

    }

    con.Close();

    }

    esta fue una solucion que me dio un amigo pero no me esplicó el porque todo  eso.

    si entiendo que en Sql para crear una variable se usa el @ lo demas ni Jota entiendo.

    muchas gracias con antelacion Miguel

    martes, 22 de enero de 2019 16:42
  • hola

    no se concatena en un string si estas asignando un parametro al command

    string query = "Insert into Monitor_Sitema(id_monitor, monitor) values( @id_monitor, @monitor)";
    
    using(var comando =  new SqlCommand(query,con)
    {
    	comando.Parameters.AddWithValue("@id_monitor",id_monitor);
    	comando.Parameters.AddWithValue("@monitor",monitor);
    	
    	comando.ExecuteNonQuery();
    
    }

    en el string del insert defines solo el nombre del parametro que luego asignas con el AddWithValue()

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Sergio Parra martes, 22 de enero de 2019 18:22
    martes, 22 de enero de 2019 16:54
  •  me mandaron esto [...] lo probé y me funcionó

    Ese código funcionará, pero tiene un error. Hay dos formas de enviar sentencias a SQL: Una es parametrizándola y asignando valores a los parámetros. Y la otra (que no es en general recomendable, aunque funciona) es concatenando los valores en la sentencia. El código que te enviaron mezcla las dos cosas: concatena valores en la sentencia, pero luego añade valores para un parámetro que no se usa nunca. Aunque se ejecute sin error, no está bien hecho.

    La variante que concatena valores es la que has hecho en el último código:

    "Insert into Monitor_Sitema(id_monitor,monitor) values("+id_monitor+",'"+monitor+"')"

    Esto funciona, pero tiene varios inconvenientes: es vulnerable ante ataques de inyección de SQL, dará error si "monitor" contiene algún carácter reservado tal como una comilla, y poluciona el caché de procedimientos del servidor por ser una sentencia ad-hoc.

    La variante parametrizada es la que te ha escrito Leandro en otra respuesta. En este caso en la sentencia se añade un parámetro (que empieza por @) en cada uno de los sitios en los que hay que "insertar" un dato, y luego esos parámetros se añaden al command asignándoles el valor que les corresponda. Esto soluciona los problemas de la sentencia ad-hoc.


    EDITADO: Nótese que el "AddWithValue" solo resuelve los dos primeros inconvenientes, pero sigue polucionando el caché de procedimientos. Para evitar este último problema hay que agregar los parámetros con la variante larga (Add en lugar de AddWithValue) asignándoles una longitud concreta.
    martes, 22 de enero de 2019 18:31