none
Sustituir código de inserción por lista genérica RRS feed

  • Pregunta

  • Hola a todos:

    Tengo el código indicado más abajo para insertar una serie de registros en una tabla de una base de datos.

    Me gustaría poder hacer lo mismo usando una lista genérica, pero no se si se puede hacer tratándose de parámetros. He usado muy poco las listas genéricas y por ello voy un poco perdida en este tema.

    Os agradecería me indicarais si se puede hacer ya que según entiendo una sola query insertaría todos los registros a la vez.

    Public Shared Sub AgregarCuentasLgoPzoColombiaParte10()
            ' Creamos el acceso a datos mediante el nombre de la cadena de conexión existente en el archivo de configuración de la aplicación.
            Dim da As DataAccessInvariant = DataAccessInvariant.GetDataAccessInvariant(Configuracion.CadenaConexion)
            Dim valor As Integer = AccesoLogica.ObtenerPeriodos()
    
            ' Declaramos una variable Connection
            Using cnn As DbConnection = da.CreateConnection()
    
                ' Creamos el Commando
                Dim cmd As DbCommand = Nothing
    
                'Accedemos al stored procedure o bien a la fórmula del mismo según tipo de Base de datos.
                cmd = MetodosCreacion.NombreProcInsercion("CreacionProcInsercionTablaBalances")
    
                ' Asignamos la conexión al comando
                cmd.Connection = cnn
    
                ' Abrimos la conexión
                cnn.Open()
    
                cmd.Parameters.Clear()
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@CodGC", "2520-1"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@Descripcion", "Prima de servicios (LP)"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@Balance", "PASIVO"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@ClaveMP", "P2"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@ClaveGP", "P25 LP"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@PlanConta", "COLOMBIA"))
                For i = 0 To 11
                    cmd.Parameters.Add(Configuracion.CreateParameter(cmd, String.Format("@ejer{0}", i), 0))
                Next
                cmd.ExecuteNonQuery()
                '******************            
    
                cmd.Parameters.Clear()
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@CodGC", "2525-1"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@Descripcion", "Vacaciones consolidadas (LP)"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@Balance", "PASIVO"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@ClaveMP", "P2"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@ClaveGP", "P25 LP"))
                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@PlanConta", "COLOMBIA"))
                For i = 0 To 11
                    cmd.Parameters.Add(Configuracion.CreateParameter(cmd, String.Format("@ejer{0}", i), 0))
                Next
                cmd.ExecuteNonQuery()
                '****************** 
    .../...
    End Using
    End sub           

    Un saludo.

    Gemma

    domingo, 14 de febrero de 2016 16:24

Respuestas

  • "gemma_campillo" preguntó:

    > Tengo el código indicado más abajo para insertar una serie de registros
    > en una tabla de una base de datos.
    >
    > Me gustaría poder hacer lo mismo usando una lista genérica, pero no se
    > si se puede hacer tratándose de parámetros.

    En principio te diré que el método ExecuteNonQuery de un objeto DbCommand, o que herede de éste, no admite parámetro alguno, por tanto, descarta que le puedas pasar a dicho método una lista genérica o cualquier otro tipo de dato.

    Y si te refieres asignarle una lista genérica al método Add de la colección Parameters de un objeto DbCommand, o que herede de éste, en principio no se admite, salvo que añadas todos los parámetros a una lista genérica y posteriormente recorras la lista para añadir cada elemento individual al método Add de la propiedad Parameters.

    Otra opción que tienes es crear una matriz o array de objetos DbParameter y pasársela al método AddRange:

                ' Declaramos una matriz para que almacene 3 elementos
                Dim matriz(2) As DbParameter
    
                ' Añadimos los parámetros a la matriz
                matriz(0) = da.CreateParameter("@empresa", VarGlobal.StrCodEmpresa)
                matriz(1) = da.CreateParameter("@CodGC", "2525-1")
                matriz(2) = da.CreateParameter("@Descripcion", "Vacaciones consolidadas (LP)")
                
                ' Añadimos la matriz a la colección Parameters del objeto DbCommand.
                cmd.Parameters.AddRange(matriz)
    
                ' Ejecutamos el método
                cmd.ExecuteNonQuery()

    La variable "da" referencia a un objeto DataAccessInvariant, la cual dispone del siguiente método:

        ''' <summary>
        ''' Devuelve un objeto DbParameter apropiado al tipo de factoría creada.
        ''' </summary>
        ''' <param name="name">Nombre del parámetro.</param>
        ''' <param name="value">Valor del parámetro.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function CreateParameter(name As String, value As Object) As DbParameter
    
            ' Crear y devolver un objeto Parameter.
            '
            Dim param As DbParameter = m_factory.CreateParameter()
            param.ParameterName = name
            param.Value = value
    
            Return param
    
        End Function

    Si el método CreateParameter no lo tienes en tu clase DataAccessInvariant, simplemente tienes que añadirlo, de ésta manera, en lugar de crear el parámetro

        cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))

    simplificarías la escritura de código escribiendo:

        matriz(0) = da.CreateParameter("@empresa", VarGlobal.StrCodEmpresa)

    pero no por ello se va a ejecutar antes.

    Lo mismo te llega alguien y te dice que sí puedes utilizar una lista genérica:

            Dim lst As New List(Of DbParameter)
    
            ' Añadir los elementos a la lista
            '
            lst.Add(da.CreateParameter("@empresa", VarGlobal.StrCodEmpresa))
            lst.Add(da.CreateParameter("@CodGC", "2525-1")
            lst.Add(da.CreateParameter("@Descripcion", "Vacaciones consolidadas (LP)")

    Pero dicha lista la tienes que convertir posteriormente en una matriz para poder pasársela al método AddRange:

     
           ' Añadimos la matriz a la colección Parameters del objeto DbCommand.
            '
            cmd.Parameters.AddRange(lst.ToArray())
    
            ' Ejecutamos el método
            cmd.ExecuteNonQuery()

    Si te encuentras cómoda añadiendo elementos a una lista genérica en lugar de añadírselos a una matriz, pues está bien que utilices una lista genérica aunque posteriormente tengas que convertirla en una matriz.

    Son las posibilidades que tienes para añadir los parámetros a una matriz o a una lista genérica que después se tiene que convertir en una matriz. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    domingo, 14 de febrero de 2016 18:28
    Moderador

Todas las respuestas

  • "gemma_campillo" preguntó:

    > Tengo el código indicado más abajo para insertar una serie de registros
    > en una tabla de una base de datos.
    >
    > Me gustaría poder hacer lo mismo usando una lista genérica, pero no se
    > si se puede hacer tratándose de parámetros.

    En principio te diré que el método ExecuteNonQuery de un objeto DbCommand, o que herede de éste, no admite parámetro alguno, por tanto, descarta que le puedas pasar a dicho método una lista genérica o cualquier otro tipo de dato.

    Y si te refieres asignarle una lista genérica al método Add de la colección Parameters de un objeto DbCommand, o que herede de éste, en principio no se admite, salvo que añadas todos los parámetros a una lista genérica y posteriormente recorras la lista para añadir cada elemento individual al método Add de la propiedad Parameters.

    Otra opción que tienes es crear una matriz o array de objetos DbParameter y pasársela al método AddRange:

                ' Declaramos una matriz para que almacene 3 elementos
                Dim matriz(2) As DbParameter
    
                ' Añadimos los parámetros a la matriz
                matriz(0) = da.CreateParameter("@empresa", VarGlobal.StrCodEmpresa)
                matriz(1) = da.CreateParameter("@CodGC", "2525-1")
                matriz(2) = da.CreateParameter("@Descripcion", "Vacaciones consolidadas (LP)")
                
                ' Añadimos la matriz a la colección Parameters del objeto DbCommand.
                cmd.Parameters.AddRange(matriz)
    
                ' Ejecutamos el método
                cmd.ExecuteNonQuery()

    La variable "da" referencia a un objeto DataAccessInvariant, la cual dispone del siguiente método:

        ''' <summary>
        ''' Devuelve un objeto DbParameter apropiado al tipo de factoría creada.
        ''' </summary>
        ''' <param name="name">Nombre del parámetro.</param>
        ''' <param name="value">Valor del parámetro.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function CreateParameter(name As String, value As Object) As DbParameter
    
            ' Crear y devolver un objeto Parameter.
            '
            Dim param As DbParameter = m_factory.CreateParameter()
            param.ParameterName = name
            param.Value = value
    
            Return param
    
        End Function

    Si el método CreateParameter no lo tienes en tu clase DataAccessInvariant, simplemente tienes que añadirlo, de ésta manera, en lugar de crear el parámetro

        cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))

    simplificarías la escritura de código escribiendo:

        matriz(0) = da.CreateParameter("@empresa", VarGlobal.StrCodEmpresa)

    pero no por ello se va a ejecutar antes.

    Lo mismo te llega alguien y te dice que sí puedes utilizar una lista genérica:

            Dim lst As New List(Of DbParameter)
    
            ' Añadir los elementos a la lista
            '
            lst.Add(da.CreateParameter("@empresa", VarGlobal.StrCodEmpresa))
            lst.Add(da.CreateParameter("@CodGC", "2525-1")
            lst.Add(da.CreateParameter("@Descripcion", "Vacaciones consolidadas (LP)")

    Pero dicha lista la tienes que convertir posteriormente en una matriz para poder pasársela al método AddRange:

     
           ' Añadimos la matriz a la colección Parameters del objeto DbCommand.
            '
            cmd.Parameters.AddRange(lst.ToArray())
    
            ' Ejecutamos el método
            cmd.ExecuteNonQuery()

    Si te encuentras cómoda añadiendo elementos a una lista genérica en lugar de añadírselos a una matriz, pues está bien que utilices una lista genérica aunque posteriormente tengas que convertirla en una matriz.

    Son las posibilidades que tienes para añadir los parámetros a una matriz o a una lista genérica que después se tiene que convertir en una matriz. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.





    domingo, 14 de febrero de 2016 18:28
    Moderador
  • Hola maestro:

    Más clara y concisa no puede ser, me queda muy claro el tema, pero me rondaba hace semanas si esos "métodos" se podrían hacer de alguna otra forma.

    Con la explicación que me has expuesto me ha quedado del todo claro.

    Muchas gracias como siempre por tus enseñanzas. Eres un genio.

    Recibe otro fuerte abrazo de tu amiga y alumna.

    Gemnma

    domingo, 14 de febrero de 2016 18:37