none
Paso de parámetros a un procedimiento almacenado asp.net vb RRS feed

  • Pregunta

  • Buenas,

    El caso es que yo paso parámetros a un procedimiento almacenado desde mi .net de un modo (el cual os voy a copiar ahora) y, me gustaría saber, si hay algún procedimiento mas corto que este para pasar valores, porque en el ejemplo son sólo 3 parámetros, pero luego puede haber procedimientos que se les pasa 20 valores y se hace muy largo y tediosa su gestion, y no se si se puede hacer de algún modo mas corto

    Public Function Procedimiento(id As Integer, eliminada As Boolean, activo As Boolean) As DataTable
            Dim Cmd = New SqlCommand()
            Dim Cn As New SqlConnection
            Cn = New SqlConnection(ConfigurationManager.ConnectionStrings("bbdd").ConnectionString)

            Dim Procedimiento As String
            Procedimiento = "PROCEDIMIENTO_ALMACENADO"

            Dim Da As SqlDataAdapter = New SqlDataAdapter(Cmd)
            Dim Dt As New DataTable

            Try
                Cn.Open()
                With Cmd
                    .Connection = Cn
                    .CommandText = Procedimiento
                    .CommandType = CommandType.StoredProcedure

                    .Parameters.Add("@i_id", SqlDbType.Int, 10)
                    .Parameters("@i_id").Value = id
                    .Parameters("@i_id").Direction = ParameterDirection.Input

                    .Parameters.Add("@i_eliminada", SqlDbType.Bit, 1)
                    .Parameters("@i_eliminada").Value = eliminada
                    .Parameters("@i_eliminada").Direction = ParameterDirection.Input

                    .Parameters.Add("@i_activo", SqlDbType.Bit, 1)
                    .Parameters("@i_activo").Value = activo
                    .Parameters("@i_activo").Direction = ParameterDirection.Input

                    Da.Fill(Dt)
                    Return Dt
                End With
            Finally
                Da = Nothing
                Dt = Nothing
                Cn = Nothing
                Cmd = Nothing
            End Try
        End Function

    Gracias

    domingo, 24 de marzo de 2019 10:22

Respuestas

  • Hola Jesús Prieto:

    Puedes utilizar Table Valued Parameters para hacerlo de un modo más simple y organizado.

    Te dejo un par de enlaces sobre como usarlos

    Table value parameters in vb.net

    https://www.red-gate.com/simple-talk/dotnet/net-framework/using-table-valued-parameters-with-vb-net/

    Table value parameters in sql server

    https://docs.microsoft.com/es-es/sql/relational-databases/tables/use-table-valued-parameters-database-engine?view=sql-server-2017

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 28 de marzo de 2019 15:48
    • Marcado como respuesta Jesús Prieto miércoles, 3 de abril de 2019 6:59
    domingo, 24 de marzo de 2019 16:40
  • .Parameters.Add("@i_id", SqlDbType.Int, 10)
    .Parameters("@i_id").Value = id
    .Parameters("@i_id").Direction = ParameterDirection.Input

    Esto se puede abreviar así:

    .Parameters.AddWithValue("@i_id", id)

    Como ves es bastante más corto, las tres líneas se resumen en una. Para empezar, el Direction por defecto es Input, por lo que no es necesario indicarlo. Y el SqlDbType.Int se infiere automáticamente cuando usas el AddWIthValue y le pasas como value un int. A partir de ese int el AddWithValue infiere que se debe convertir en un SqlDbType.Int. La longitud 10 que le has puesto no tiene ningún sentido. El int nunca puede tener longitud 10. El sistema lo desprecia y usa automáticamente la longitud 4 que siempre tienen los int.

    Esto se puede hacer con casi todos los tipos de parámetros, pero no es buena idea usar el AddWithValue cuando el parámetro es de tipo String. Si lo haces, funciona: te infiere un parámetro nvarchar con la misma longitud que el string. El problema de eso es que si lo repites muchas veces con distintos strings, como la longitud va cambiando, te poluciona el caché de procedimientos y se pierde algo de eficiencia. Así que con los strings es preferible usar la definición larga. Pero la puedes resumir en una línea en lugar de tres:

    .Parameters.Add("@loquesea", SqlDbType.Varchar, 123).Value = miDato

    • Marcado como respuesta Jesús Prieto miércoles, 3 de abril de 2019 7:05
    domingo, 24 de marzo de 2019 21:13

Todas las respuestas

  • Hola Jesús Prieto:

    Puedes utilizar Table Valued Parameters para hacerlo de un modo más simple y organizado.

    Te dejo un par de enlaces sobre como usarlos

    Table value parameters in vb.net

    https://www.red-gate.com/simple-talk/dotnet/net-framework/using-table-valued-parameters-with-vb-net/

    Table value parameters in sql server

    https://docs.microsoft.com/es-es/sql/relational-databases/tables/use-table-valued-parameters-database-engine?view=sql-server-2017

    • Propuesto como respuesta Carlos_Ruiz_M jueves, 28 de marzo de 2019 15:48
    • Marcado como respuesta Jesús Prieto miércoles, 3 de abril de 2019 6:59
    domingo, 24 de marzo de 2019 16:40
  • .Parameters.Add("@i_id", SqlDbType.Int, 10)
    .Parameters("@i_id").Value = id
    .Parameters("@i_id").Direction = ParameterDirection.Input

    Esto se puede abreviar así:

    .Parameters.AddWithValue("@i_id", id)

    Como ves es bastante más corto, las tres líneas se resumen en una. Para empezar, el Direction por defecto es Input, por lo que no es necesario indicarlo. Y el SqlDbType.Int se infiere automáticamente cuando usas el AddWIthValue y le pasas como value un int. A partir de ese int el AddWithValue infiere que se debe convertir en un SqlDbType.Int. La longitud 10 que le has puesto no tiene ningún sentido. El int nunca puede tener longitud 10. El sistema lo desprecia y usa automáticamente la longitud 4 que siempre tienen los int.

    Esto se puede hacer con casi todos los tipos de parámetros, pero no es buena idea usar el AddWithValue cuando el parámetro es de tipo String. Si lo haces, funciona: te infiere un parámetro nvarchar con la misma longitud que el string. El problema de eso es que si lo repites muchas veces con distintos strings, como la longitud va cambiando, te poluciona el caché de procedimientos y se pierde algo de eficiencia. Así que con los strings es preferible usar la definición larga. Pero la puedes resumir en una línea en lugar de tres:

    .Parameters.Add("@loquesea", SqlDbType.Varchar, 123).Value = miDato

    • Marcado como respuesta Jesús Prieto miércoles, 3 de abril de 2019 7:05
    domingo, 24 de marzo de 2019 21:13
  • Buenas,

    Gracias, muy útil

    ¿Pero si quisiera que el parámetro fuera output en vez de input?

    Gracias

    jueves, 4 de abril de 2019 16:53
  • Entonces requieres una línea más para asignar el ParameterDirection, a no ser que aproveches que el .Add devuelve el propio parámetro que se ha añadido:

    .Parameters.AddWithValue("@loquesea", loquesea).Direction = ParameterDirection.Output

    Pero si tienes que asignar el .Value y el .Direction (o cualquier otra propiedad) entonces ya tendrás que usar más de una línea de código.

    jueves, 4 de abril de 2019 17:05