none
Multiples updates a SQL Server haciendo uso de un timer RRS feed

  • Pregunta

  • Buen día masters, quisera preguntar si hay alguna forma de reducir el código de varios update a una BD en SQL Server, este código se ejecuta con un timer cada segundo

    Adjunto código de ejemplo:

            Try
                Dim conn As New System.Data.SqlClient.SqlConnection("Data Source=127.0.0.0; Initial Catalog=Monitor; Integrated Security=True")
                conn.Open()
    
                Dim sqlInsert1 As String = "Update A8 set VALUE_TAG = '" & value1 & "' where ID = '1'"
                Dim sqlInsert2 As String = "Update A8 set VALUE_TAG = '" & value2 & "' where ID = '2'"
                Dim sqlInsert3 As String = "Update A8 set VALUE_TAG = '" & value3 & "' where ID = '3'"
                Dim sqlInsert4 As String = "Update A8 set VALUE_TAG = '" & value4 & "' where ID = '4'"
                Dim sqlInsert5 As String = "Update A8 set VALUE_TAG = '" & value5 & "' where ID = '5'"
                Dim sqlInsert6 As String = "Update A8 set VALUE_TAG = '" & value6 & "' where ID = '6'"
                Dim sqlInsert7 As String = "Update A8 set VALUE_TAG = '" & value7 & "' where ID = '7'"
                Dim sqlInsert8 As String = "Update A8 set VALUE_TAG = '" & value8 & "' where ID = '8'"
                Dim sqlInsert9 As String = "Update A8 set VALUE_TAG = '" & value9 & "' where ID = '9'"
                Dim sqlInsert10 As String = "Update A8 set VALUE_TAG = '" & value10 & "' where ID = '10'"
                Dim sqlInsert11 As String = "Update A8 set VALUE_TAG = '" & value11 & "' where ID = '11'"
                Dim sqlInsert12 As String = "Update A8 set VALUE_TAG = '" & value12 & "' where ID = '12'"
                Dim sqlInsert13 As String = "Update A8 set VALUE_TAG = '" & value13 & "' where ID = '13'"
                Dim sqlInsert14 As String = "Update A8 set VALUE_TAG = '" & value14 & "' where ID = '14'"
                Dim sqlInsert15 As String = "Update A8 set VALUE_TAG = '" & value15 & "' where ID = '15'"
                Dim sqlInsert16 As String = "Update A8 set VALUE_TAG = '" & value16 & "' where ID = '16'"
                Dim sqlInsert17 As String = "Update A8 set VALUE_TAG = '" & value17 & "' where ID = '17'"
                Dim sqlInsert18 As String = "Update A8 set VALUE_TAG = '" & value18 & "' where ID = '18'"
                Dim sqlInsert19 As String = "Update A8 set VALUE_TAG = '" & value19 & "' where ID = '19'"
                Dim sqlInsert20 As String = "Update A8 set VALUE_TAG = '" & value20 & "' where ID = '20'"
    
                Dim cmd As New SqlClient.SqlCommand
                cmd = New SqlClient.SqlCommand(sqlInsert1, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert2, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert3, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert4, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert5, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert6, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert7, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert8, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert9, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert10, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert11, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert12, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert13, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert14, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert15, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert16, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert17, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert18, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert19, conn)
                cmd.ExecuteNonQuery()
                cmd = New SqlClient.SqlCommand(sqlInsert20, conn)
                cmd.ExecuteNonQuery()
    
                conn.Close()
            Catch ex As Exception
                StatusTimer.Text = ex.Message
            End Try


    • Editado Vicardias miércoles, 27 de enero de 2021 19:49
    • Cambiado EricRR miércoles, 27 de enero de 2021 20:44 SQL
    miércoles, 27 de enero de 2021 19:49

Respuestas

  • No hace falta que instancies 20 SqlCommands para ejecutar los 20 comandos. Un único SqlCommand se puede reutilizar sin más que irle cambiando el CommandText para que ejecute diferentes sentencias.

    Tampoco es necesario que envíes las 20 sentencias por separado ejecutando 20 ExecuteNonQuery. En su lugar, concatena las 20 sentencias "Update" en un único string separándolas con punto y coma. Y entonces ese string grandote lo ejecutas de una sola vez con un único ExecuteNonQuery y un único SqlCommand. De esa manera, se produce una única llamada de ida y vuelta al servidor de base de datos, en lugar de 20 llamadas, con lo que será bastante menos costoso en tiempo.

    En otras palabras, se resume como sigue:

                Dim sqlInsert As String = "Update A8 set VALUE_TAG = '" & value1 & "' where ID = '1'"
                sqlInsert = sqlInsert & "; Update A8 set VALUE_TAG = '" & value2 & "' where ID = '2'"
                sqlInsert = sqlInsert & "; Update A8 set VALUE_TAG = '" & value3 & "' where ID = '3'"
                ... etc ...
                sqlInsert = sqlInsert & "; Update A8 set VALUE_TAG = '" & value20 & "' where ID = '20'"
    
                Dim cmd As New SqlClient.SqlCommand(sqlInsert, conn)
                cmd.ExecuteNonQuery()    



    miércoles, 27 de enero de 2021 19:58

Todas las respuestas

  • No hace falta que instancies 20 SqlCommands para ejecutar los 20 comandos. Un único SqlCommand se puede reutilizar sin más que irle cambiando el CommandText para que ejecute diferentes sentencias.

    Tampoco es necesario que envíes las 20 sentencias por separado ejecutando 20 ExecuteNonQuery. En su lugar, concatena las 20 sentencias "Update" en un único string separándolas con punto y coma. Y entonces ese string grandote lo ejecutas de una sola vez con un único ExecuteNonQuery y un único SqlCommand. De esa manera, se produce una única llamada de ida y vuelta al servidor de base de datos, en lugar de 20 llamadas, con lo que será bastante menos costoso en tiempo.

    En otras palabras, se resume como sigue:

                Dim sqlInsert As String = "Update A8 set VALUE_TAG = '" & value1 & "' where ID = '1'"
                sqlInsert = sqlInsert & "; Update A8 set VALUE_TAG = '" & value2 & "' where ID = '2'"
                sqlInsert = sqlInsert & "; Update A8 set VALUE_TAG = '" & value3 & "' where ID = '3'"
                ... etc ...
                sqlInsert = sqlInsert & "; Update A8 set VALUE_TAG = '" & value20 & "' where ID = '20'"
    
                Dim cmd As New SqlClient.SqlCommand(sqlInsert, conn)
                cmd.ExecuteNonQuery()    



    miércoles, 27 de enero de 2021 19:58
  • Gracias por la respuesta, lo intentare, muchas gracias.
    miércoles, 27 de enero de 2021 20:57