Principales respuestas
Problema al ingresar un campo

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
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
- TransactionScope (Clase)
Crea un bloque de código transaccional.
https://msdn.microsoft.com/es-es/library/system.transactions.transactionscope.aspx - http://www.codeproject.com/Articles/690136/All-About-TransactionScope
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
- TransactionScope (Clase)
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.
-
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 -
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
-
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
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
-
[...] 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.
- Propuesto como respuesta Jose A. Fernandez sábado, 4 de abril de 2015 18:59
-
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
- TransactionScope (Clase)
Crea un bloque de código transaccional.
https://msdn.microsoft.com/es-es/library/system.transactions.transactionscope.aspx - http://www.codeproject.com/Articles/690136/All-About-TransactionScope
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
- TransactionScope (Clase)