none
Varios Update en un mismo SqlCommand

    Pregunta

  • Hola compañeros, trabajando con VB.NET y SQL Server tengo una duda...

    Hay veces que necesito hacer varios UPDATE en una misma función. Mi duda es si puedo hacerlo en un mismo SQLCommand para evitar escribir unas pocas líneas o que así sea mas eficiente... Actualmente el Update lo hago asi:

                'Botón ACEPTAR.
                Dim QueryEntrada As String = "UPDATE FVAR SET concepto= '" & Varios.TxtConcepto.Text &
                                     "',prov= '" & Varios.TxtProv.Text &
                                     "',cantidad= '" & Varios.TxtCantidad.Text &
                                     "',stock_min= '" & Varios.TxtStockMin.Text &
                                     "' WHERE codigo= '" & Varios.TxtCodigo.Text & "'"
                Cnn.Open()
                Dim cmd As New SqlClient.SqlCommand(query, Cnn)
                cmd.ExecuteNonQuery()
                Cnn.Close()

    Luego necesitaría hacer un INSERT en otra tabla, habría posibilidad de hacerlo sin volver a crear un SqlCommand....

    Saludos.

    miércoles, 14 de septiembre de 2016 9:21

Respuestas

  • Hola RamonAZ:

    Te voy a dar mi opinión personal ya que me he topado con centenares de actualizaciones a las tablas.

    1) Deberías usar parámetros y evitar la concatenación para rellenar los campos. Te pongo un ejemplo en Access-

    Dim cadenaConexion As String = Configuracion.CadenaConexion Using Cnn As New OleDbConnection(cadenaConexion) Dim cmd As OleDbCommand = Cnn.CreateCommand() cmd.CommandType = CommandType.Text With cmd.Parameters .Clear() .AddWithValue("@concepto", Varios.TxtConcepto.Text) .AddWithValue("@prov", Varios.TxtProv.Text) .AddWithValue("@cantidad", Varios.TxtCantidad.Text) .AddWithValue("@stockmin", Varios.TxtStockMin.Text)

    .AddWithValue("@cod", Varios.TxtCodigo.Text)

    End With cmd.CommandText = ("UPDATE FVAR SET conceto = @concepto,

    prov = ("@prov, cantidad = @cantidad, stock_min = @soctmin WHERE codigo = @cod") ' Asignamos la conexión al comando

    cmd.Connection = cnn Cnn.open cmd.ExecuteNonQuery()

    end using

    En seguno lugar aplica siempre que puedas la máxima "divide y vencerás", con ello te quiero decir que no es bueno carga en un solo procedimiento tantos updates ya que ello te puede acarrear problemas, el código queda más claro si cada procedimiento hace lo suyo, una actualización, una select, etc.

    Ello no quiere decir que no lo puedas aplicar en el mismo procedimiento un insert y un update, de cualquier forma veo que no son procedimientos complejos. Tu eliges. El que lo tengas en diferentes procedimientos no quiere decir que tardes mas. y que la apertura de la base de datos funciona con un pol que recuerda la apertura de la misma.

    El tema de los parámetros aparte de que el código es mucho más legible y es lo correcto, evitarás posibles inyecciones de código a tu programa.

    Bueno, espero que lo hayas entendido.

    Un saludo.

    Gemma

    • Marcado como respuesta RamonAZ miércoles, 14 de septiembre de 2016 10:47
    miércoles, 14 de septiembre de 2016 10:05

Todas las respuestas

  • Hola RamonAZ:

    Te voy a dar mi opinión personal ya que me he topado con centenares de actualizaciones a las tablas.

    1) Deberías usar parámetros y evitar la concatenación para rellenar los campos. Te pongo un ejemplo en Access-

    Dim cadenaConexion As String = Configuracion.CadenaConexion Using Cnn As New OleDbConnection(cadenaConexion) Dim cmd As OleDbCommand = Cnn.CreateCommand() cmd.CommandType = CommandType.Text With cmd.Parameters .Clear() .AddWithValue("@concepto", Varios.TxtConcepto.Text) .AddWithValue("@prov", Varios.TxtProv.Text) .AddWithValue("@cantidad", Varios.TxtCantidad.Text) .AddWithValue("@stockmin", Varios.TxtStockMin.Text)

    .AddWithValue("@cod", Varios.TxtCodigo.Text)

    End With cmd.CommandText = ("UPDATE FVAR SET conceto = @concepto,

    prov = ("@prov, cantidad = @cantidad, stock_min = @soctmin WHERE codigo = @cod") ' Asignamos la conexión al comando

    cmd.Connection = cnn Cnn.open cmd.ExecuteNonQuery()

    end using

    En seguno lugar aplica siempre que puedas la máxima "divide y vencerás", con ello te quiero decir que no es bueno carga en un solo procedimiento tantos updates ya que ello te puede acarrear problemas, el código queda más claro si cada procedimiento hace lo suyo, una actualización, una select, etc.

    Ello no quiere decir que no lo puedas aplicar en el mismo procedimiento un insert y un update, de cualquier forma veo que no son procedimientos complejos. Tu eliges. El que lo tengas en diferentes procedimientos no quiere decir que tardes mas. y que la apertura de la base de datos funciona con un pol que recuerda la apertura de la misma.

    El tema de los parámetros aparte de que el código es mucho más legible y es lo correcto, evitarás posibles inyecciones de código a tu programa.

    Bueno, espero que lo hayas entendido.

    Un saludo.

    Gemma

    • Marcado como respuesta RamonAZ miércoles, 14 de septiembre de 2016 10:47
    miércoles, 14 de septiembre de 2016 10:05
  • Hola Gema, si lo de los parámetros estoy totalmente de acuerdo con tigo, se me pasó y puse los textbox ahí... Es una mala costumbre que tengo.

    Si me recomiendas que lo haga todo por separado lo haré así, lo he estado haciendo así siempre pero era por si había otra forma que fuese mejor.

    Un saludo y gracias!

    miércoles, 14 de septiembre de 2016 10:47
  • Hola RamonAZ:

    En caso de que tuvieras muchas operaciones de update que hacer, podrías utilizar las listas genéricas, ya que de, digamos una tacada si que podrías resolver el tema de inserción o actualización a la vez, el sistema es una maravilla y desde luego el código de un update o de un insert por ejemplo se reduce a una línea de código.

    Un saludo.

    Gemma

    miércoles, 14 de septiembre de 2016 12:53