none
Problema al ingresar un campo RRS feed

  • Pregunta

  • Buenas cómo están,quiero ingresar un campo integer a la base de datos sin que se tenga que digitar en un textbox,he tratado de hacerlo pero no ha funcionado.

    Este es el código dónde ingreso los datos,también he intentado poner un consecutivo,pero al cargar no sale en el textbox (oculto),espero me puedan ayudar con este problema un saludo a todos.


    Protected Sub Enviar_Click(sender As Object, e As EventArgs) Handles Enviar.Click
            Dim cmd As New MySqlCommand
    
            Try
    
                conexionaDatos()
    
                'Dim qery As New MySqlCommand
    
    
                cmd.Connection = conexion
                cmd.CommandText = "PQRWeb"
                cmd.CommandType = CommandType.StoredProcedure
    
                cmd.Parameters.Add("@Ced", MySqlDbType.Int16).Value = TxtCedula.Text
                cmd.Parameters("@Ced").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Nom", MySqlDbType.VarChar, 45).Value = TxtNombre.Text
                cmd.Parameters("@Nom").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Apel", MySqlDbType.VarChar, 45).Value = TxtApellido.Text
                cmd.Parameters("@Apel").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Tel", MySqlDbType.Int16).Value = Txttelefono.Text
                cmd.Parameters("@Tel").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Dir", MySqlDbType.VarChar, 45).Value = txtdireccion.Text
                cmd.Parameters("@Dir").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Emai", MySqlDbType.VarChar, 45).Value = txtemail.Text
                cmd.Parameters("@Emai").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Id_Re", MySqlDbType.Int16).Value = DDL_Regimen.Text
                cmd.Parameters("@Id_Re").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@rec", MySqlDbType.LongText).Value = Txtreclamo.Text
                cmd.Parameters("@rec").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Id_asu", MySqlDbType.Int16).Value = DDL_Asunto.Text
                cmd.Parameters("@Id_asu").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Obs", MySqlDbType.VarChar).Value = "-"
                cmd.Parameters("@Obs").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Est", MySqlDbType.Int16).Value = "3"
                cmd.Parameters("@Est").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Emp", MySqlDbType.Int16).Value = "7"
                cmd.Parameters("@Emp").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Dep", MySqlDbType.Int16).Value = "9"
                cmd.Parameters("@Dep").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Fecha_r", MySqlDbType.DateTime)
                cmd.Parameters("@Fecha_r").Direction = ParameterDirection.Input
                cmd.Parameters.Add("@Id_us", MySqlDbType.Int16)
                cmd.Parameters("@Id_us").Direction = ParameterDirection.Input  'campo en el que quiero ingresar sin un textbox y sin un valor predeterminado
                cmd.Connection = conexion
                cmd.ExecuteNonQuery()
    
                Console.WriteLine("Id_usuario: " & cmd.Parameters("@Id_us").Value)
            Catch ex As MySql.Data.MySqlClient.MySqlException
                Console.WriteLine(("Error " & ex.Number & " has occurred: ") + ex.Message)
    
                conexion.Close()
                Console.WriteLine("Done.")
    
            Catch ex As Exception
                MsgBox("error en inserción")
            End Try





    • Editado Krej sábado, 4 de abril de 2015 14:15
    sábado, 4 de abril de 2015 13:29

Respuestas

  • Estimado  Xosé

    Como te comentan Alberto y Lisandro, seria bueno que la DB lo haga asi la "restricción" esta físicamente en la DB y no en el codigo y es mas facil de mantener.

    Veo que uutilizas My SQL no conozco si tiene INCREMENT para un campo no sea primary key, pero si vi que tiene algo UNIQUE INDEX que lo puedes retringir. La idea que sea unico y se puede generar mucho mejor (aqui es mas una pregunta para My SQL que para ASP.NET)

    AHora bien, si como mencionas el valor es de otra DB (habia que ver como funciona Transacciones Distribuidas en My SQL...) pero la idea es que  encapsules tu codigo dentro de un TransacctionScope (hay que ver que version de MySQL tienes y si soporta) pero seria algo asi

    using (TransactionScope scope = new TransactionScope())
    {
      //Tu codigo que escribe y lee en la DB
    
      
      //Completando la transaccion
    	scope.Complete();
    }

    Alli dentro tendrias que leer el ultimo Valor (un MAX de ese campo de esa tabla, no conozco la sintasis SQL de MySQL) y luego escribir en el Procedimiento
    PERO ME GUSTA que en el Procedimiento Almacenado que estas utilizando tengas una transaccion y alli hagas todo (tambien es otra alternativa)

    Enlaces que te pueden ayudar

    Espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja

    • Marcado como respuesta Krej sábado, 4 de abril de 2015 22:16
    sábado, 4 de abril de 2015 19:14

Todas las respuestas

  • Para asignarle un valor al parámetro no tienes más que asignar un string a su .Value, no hay ninguna razón para que el string tenga que provenir de un TextBox:

    cmd.Parameters("@Id_us").Value = 12345

    Pero no se comprende por qué tienes esta duda, ya que este mismo principio ya lo estás haciendo con otros parámetros, así que debería resutarte familiar. Tiene que existir algún otro problema que no resulta obvio leyendo tu pregunta, tendrías que aclararla un poco más.

    Por cierto, veo un posible error en tu código (que no tiene nada que ver con lo de pasarle un valor al parámetro): después de hacer el ExecuteNonQuery intentas presentar en consola el valor del parámetro, pero tu parámetro lo has declarado de tipo Input, así que siempre tendrá el mismo valor que le metiste inicialmente, el procedimiento no podrá cambiarlo.

    sábado, 4 de abril de 2015 14:54
  • hola

    >>campo en el que quiero ingresar sin un textbox y sin un valor predeterminado

    por lo que entiendo ese es un campo es el id de la tabla, porque no lo defines como autonumerico, de esta forma se genera de forma automatica el secuencial

     como insertar un valor auto_incremet en mysql desde c#

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 4 de abril de 2015 15:07
  • cmd.Parameters("@Id_us").Value = 12345

    Pero no se comprende por qué tienes esta duda, ya que este mismo principio ya lo estás haciendo con otros parámetros, así que debería resutarte familiar. Tiene que existir algún otro problema que no resulta obvio leyendo tu pregunta, tendrías que aclararla un poco más.

    Pasa que si lo inserto de tal cual como dices,así me saldrá en la base de datos,lo que quiero es que inserte un valor diferente (consecutivo cada vez que inserte datos).



    • Editado Krej sábado, 4 de abril de 2015 15:14
    sábado, 4 de abril de 2015 15:09
  • hola

    >>campo en el que quiero ingresar sin un textbox y sin un valor predeterminado

    por lo que entiendo ese es un campo es el id de la tabla, porque no lo defines como autonumerico, de esta forma se genera de forma automatica el secuencial

     como insertar un valor auto_incremet en mysql desde c#

    No puedo definirlo como autonumerico,es un id de otra tabla.

    Otra cosa es que la manera en que se inserta un valor auto incrementable en el ejemplo no se como complementarlas en mi código,además he leido que ese código expone una gran vulnerabilidad a Sql Inyection.
    • Editado Krej sábado, 4 de abril de 2015 19:48
    sábado, 4 de abril de 2015 15:30
  • [...] lo que quiero es que inserte un valor diferente (consecutivo cada vez que inserte datos).

    Ah, en ese caso lo más eficiente sería que la propia base de datos lo hiciese con un auto_increment, cosa que requeriría modificar el procedimiento almacenado (poniendo lo que ya te han indicado en otra respuesta).

    Si por alguna razón no puedes modificar el procedimiento, y tienes que hacerlo firzosamente desde el lado cliente, entonces tienes que iniciar una transacción, leer el máximo valor que haya en la base de datos, sumarle 1, grabarlo, y confirmar la transacción. Se puede hacer, pero como puedes ver es bastante más trabajoso que retocar el procedimiento para que haga un auto-incremento.

    sábado, 4 de abril de 2015 15:31
  • Estimado  Xosé

    Como te comentan Alberto y Lisandro, seria bueno que la DB lo haga asi la "restricción" esta físicamente en la DB y no en el codigo y es mas facil de mantener.

    Veo que uutilizas My SQL no conozco si tiene INCREMENT para un campo no sea primary key, pero si vi que tiene algo UNIQUE INDEX que lo puedes retringir. La idea que sea unico y se puede generar mucho mejor (aqui es mas una pregunta para My SQL que para ASP.NET)

    AHora bien, si como mencionas el valor es de otra DB (habia que ver como funciona Transacciones Distribuidas en My SQL...) pero la idea es que  encapsules tu codigo dentro de un TransacctionScope (hay que ver que version de MySQL tienes y si soporta) pero seria algo asi

    using (TransactionScope scope = new TransactionScope())
    {
      //Tu codigo que escribe y lee en la DB
    
      
      //Completando la transaccion
    	scope.Complete();
    }

    Alli dentro tendrias que leer el ultimo Valor (un MAX de ese campo de esa tabla, no conozco la sintasis SQL de MySQL) y luego escribir en el Procedimiento
    PERO ME GUSTA que en el Procedimiento Almacenado que estas utilizando tengas una transaccion y alli hagas todo (tambien es otra alternativa)

    Enlaces que te pueden ayudar

    Espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja

    • Marcado como respuesta Krej sábado, 4 de abril de 2015 22:16
    sábado, 4 de abril de 2015 19:14