Etiqueta: .NET

Temas relacionados con .NET Framework (todas las versiones)

  • Cómo usar las Tuplas en Visual Basic y C Sharp con .NET Core 2.1 (o Visual Studio 2017 con .NET 4.7.2)

    Pues eso… aquí te voy a explicar (con ejemplo de código) cómo definir y usar las tuplas (Tuples) en Visual Basic .NET (y para los amantes de C#, también pondré algunos ejemplos en ese lenguaje puntoycomagudo Winking smile)

    En esta primera «entrega» te voy a dar 3 ejemplos (+ 1 extra) de cómo usar las tuplas con .NET Core 2.1 (si prefieres hacerlo con .NET normal tendrás que usar la versión 4.7.2 o superior) en una aplicación de Consola.

    El contenido es el siguiente:

    Ejemplo 1: definir las tuplas sin nombres
    Ejemplo 2: definir las tuplas con nombres y asignación después de definir
    Ejemplo 3: definir las tuplas con nombres y asignando al definir
    Ejemplo 4: definir las tuplas con nombres y asignando al definir (al estilo de C#)
    Ejemplo 5: definir un método que recibe un array tuplas

    Mmmmm… te dije 3 + un extra y resulta que son 4 + un extra Winking smile

    Si no sabes qué son las tuplas, decirte que son como una estructura (Struct) pero definidas de forma «directa» sin necesidad de crear el tipo previamente.

    Si quieres saber más sobre las tuplas, te recomiendo que leas la documentación de .NET:
    Tipos de tupla en C#
    Tuplas (Visual Basic)

    Código de uso de Tuplas (Tuples) en Visual Basic

    Ejemplo 1: Ejemplo básico de tuplas sin definir los nombres de los miembros:

    ' Al definirla de esta forma 
    ' tenemos una tupla con dos elementos del tipo cadena
    Dim t1 = ("Hola", "mundo")
    
    ' para acceder a los miembros usaremos Item1, Item2
    Console.WriteLine("{0} {1}", t1.Item1, t1.Item2)

    Ejemplo 2: Definimos una tupla con miembros con nombres, asignando los nombres individualmente. Para acceder a los miembros de la tupla usamos los nombres.

    ' definimos una tupla con miembros con nombres
    Dim t2 As (saludo As String, destino As String)
    ' para acceder a los miembros, usamos los nombres
    t2.saludo = "Hola"
    t2.destino = "Mundo"
    
    Console.WriteLine("{0} {1}", t2.saludo, t2.destino)

    Ejemplo 3: Definimos una tupla con miembros con nombres, asignando los valores al definirla. Para acceder a los miembros, usamos los nombres.

    ' definimos una tupla con miembros con nombres
    Dim t2 As (saludo As String, destino As String) =
    ("Hola", "Mundo") ' para acceder a los miembros, usamos los nombres Console.WriteLine("{0} {1}", t2.saludo, t2.destino)

    Ejemplo 4: Definimos una tupla con miembros con nombres, asignando los valores al definirla. Para acceder a los miembros, usamos los nombres.

    ' definimos una tupla con miembros con nombres
    Dim t2 = (saludo:="Hola", destino:="Mundo")
    ' para acceder a los miembros, usamos los nombres
    Console.WriteLine("{0} {1}", t2.saludo, t2.destino)

    Ejemplo 5 (extra): Método que recibe un array de tipo «tupla».

    Este código es un método llamado colorear que recibe un array del tipo (ConsoleColor, String), se procesa cada uno de los elementos del array y se usa el valor del color para indicar el color del valor ForegroundColor (color del texto) de la clase Consola, el contenido del valor String lo usamos para mostrarlo en la consola por medio de WriteLine.

    Con ese código se consiguen salidas en la ventana de la consola como la siguiente:

    tuplasVB_04

    El código del método colorear es el siguiente:

    ''' <summary>
    ''' Colorear la salida de los ejemplos, 
    ''' también usando tuplas ;-)
    ''' Se pasa como argumento 
    ''' un array del tipo (color As ConsoleColor, texto As String)
    ''' </summary>
    ''' <param name=items">un array del tipo (color As ConsoleColor, texto As String)</param>"
    Private Sub colorear(items As (color As ConsoleColor, texto As String)())
        For Each it In items
            Console.ForegroundColor = it.color
            Console.WriteLine(it.texto)
        Next
    
        Console.ForegroundColor = co.Gray
        Console.WriteLine()
    End Sub

    Para usarlo podemos hacer como en el código para el cuarto ejemplo:

    Private Sub ejemplo4()
        colorear({(co.Green, "definimos una tupla con miembros con nombres"),
                  (co.Green, "(asignando los valores al definirla)"),
                  (co.Yellow, "Dim t2 = (saludo:=""Hola"", destino:=""Mundo"")"),
                  (co.Green, "para acceder a los miembros, usamos los nombres"),
                  (co.Yellow, "Console.WriteLine(""{0} {1}"", t2.saludo, t2.destino)")})
    
        ' definimos una tupla con miembros con nombres
        Dim t2 = (saludo:="Hola", destino:="Mundo")
        ' para acceder a los miembros, usamos los nombres
        Console.WriteLine("{0} {1}", t2.saludo, t2.destino)
    
        Console.ReadLine()
    End Sub

    Nota:
    Es curioso, pero resulta que es más fácil definir los parámetros (de tipo array o matriz) directamente en la llamada del método colorear en Visual Basic que en C#.
    En Visual Basic se indica el array del tipo tupla de la siguiente forma:

    colorear({
        (co.Green, «definimos una tupla con miembros con nombres»),

         (co.Green, «(asignando los valores al definirla)»),     (co.Yellow, «Dim t2 = (saludo:=»»Hola»», destino:=»»Mundo»»)»),

         (co.Green, «para acceder a los miembros, usamos los nombres»),

         (co.Yellow, «Console.WriteLine(«»{0} {1}»», t2.saludo, t2.destino)»)})

    Mientras que en C# hay indicar que es un nuevo array:
    colorear(new []{
           (co.Green, «definimos una tupla con miembros con nombres»),
           (co.Green, «(asignando los valores al definirla)»),
           (co.Yellow, «var t2 = (saludo:\»Hola\», destino:\»Mundo\»);»),
           (co.Green, «para acceder a los miembros, usamos los nombres»),
           (co.Yellow, «Console.WriteLine(\»{0} {1}\», t2.saludo, t2.destino);»)});

    Y esto es todo por hoy.
    Bueno, no, más abajo te muestro el código de estos dos últimos códigos para C#.

    Nota:
    En otra ocasión te mostraré más código de ejemplo del uso de tuplas en Visual Basic y C#, seguramente usando funciones que devuelvan tuplas y cómo usar la «inferencia» de los argumentos con nombre… ¿se podrá hacer eso con Visual Basic? sí se puede… pero necesita más explicación, ya que el Visual Studio 2017 no lo compilará y hay que hacer «un tuquillo» para que lo compile. Con C# tampoco lo compila, y también hay que hacer un truco similar al de Visual Basic.
    En realidad no te lo explico aquí porque no lo había probado, entre otras cosas porque no me ha hecho falta; lo de la función que devuelve una tupla si que lo he usado en una aplicación que estoy haciendo actualmente.

    Espero que te sea de utilidad Smile

    Nos vemos.
    Guillermo

    P.S. 09/Dic/18:
    No es un artículo dedicado a las tuplas, pero en el ejemplo que publiqué ayer sobre el Error al guardar datos decimales: El valor del parámetro ‘xxx’ está fuera del intervalo tienes un ejemplo de cómo usar una función que devuelve una tupla.

    Private Function AñadirMiTabla1(valor As Decimal) As (hayError As Boolean, msg As String)

    private (bool hayError, string msg) AñadirMiTabla1(decimal valor)

    P.S.

    Código de uso de Tuplas (Tuples) en C#

    Ejemplo 1: Ejemplo básico de tuplas sin definir los nombres de los miembros:

    // Al definirla de esta forma
    // tenemos una tupla con dos elementos del tipo cadena
    var t1 = ("Hola", "mundo");
    
    // para acceder a los miembros usaremos Item1, Item2
    Console.WriteLine("{0} {1}", t1.Item1, t1.Item2);

    Ejemplo 4: Definimos una tupla con miembros con nombres, asignando los valores al definirla. Para acceder a los miembros, usamos los nombres.

    // definimos una tupla con miembros con nombres
    var t2 = (saludo: "Hola", destino: "Mundo");
    // para acceder a los miembros, usamos los nombres
    Console.WriteLine("{0} {1}", t2.saludo, t2.destino);

    Ejemplo 5 (extra): Método que recibe un array de tipo «tupla».

    Este código es un método llamado colorear que recibe un array del tipo (ConsoleColor, string), se procesa cada uno de los elementos del array y se usa el valor del color para indicar el color del valor ForegroundColor (color del texto) de la clase Consola, el contenido del valor string lo usamos para mostrarlo en la consola por medio de WriteLine.

    Con ese código se consiguen salidas en la ventana de la consola como la siguiente:

    tuplasCS_04

    El código del método colorear es el siguiente:

    /// <summary>
    /// Colorear la salida de los ejemplos,
    /// también usando tuplas ;-)
    /// Se pasa como argumento
    /// un array del tipo (ConsoleColor color, string texto)
    /// </summary>
    /// <param name=items">un array del tipo (ConsoleColor color, string texto)</param>"
    static private void colorear((ConsoleColor color, string texto)[] items)
    {
        foreach (var it in items)
        {
            Console.ForegroundColor = it.color;
            Console.WriteLine(it.texto);
        }
    
        Console.ForegroundColor = co.Gray;
        Console.WriteLine();
    }

    Para usarlo podemos hacer como en el código para el cuarto ejemplo:

    /// <summary>
    /// Definimos una tupla con miembros con nombres
    /// (asignando los valores al definirla)
    /// Para acceder a los miembros, usamos los nombres
    /// </summary>
    static private void ejemplo4()
    {
        //new (co color,string texto)[]
    
        colorear(new []{
              (co.Green, "definimos una tupla con miembros con nombres"),
              (co.Green, "(asignando los valores al definirla)"),
              (co.Yellow, "var t2 = (saludo:\"Hola\", destino:\"Mundo\");"),
              (co.Green, "para acceder a los miembros, usamos los nombres"),
              (co.Yellow, "Console.WriteLine(\"{0} {1}\", t2.saludo, t2.destino);")});
    
        // definimos una tupla con miembros con nombres
        var t2 = (saludo: "Hola", destino: "Mundo");
        // para acceder a los miembros, usamos los nombres
        Console.WriteLine("{0} {1}", t2.saludo, t2.destino);
    
        Console.ReadLine();
    }

    ¡Hasta el siguiente post! Smile

  • Cuidado con las horas de las fechas en las consultas de SQL

    Pues eso… que esto de las fechas en las consultas es como el cuento de nunca acabar… al menos para mí, jeje.

    Lo que me ha pasado esta vez es que he estado usando fechas en una consulta y, como ya comenté hace años, la mejor forma de pasarlas a la consulta de SQL es usando parámetros, hasta aquí todo bien.

    ' Crear un nuevo objeto del tipo DataAdapter
    da = New SqlDataAdapter(sel, sCon)
    da.SelectCommand.Parameters.AddWithValue("@fecha1", fecha1)
    da.SelectCommand.Parameters.AddWithValue("@fecha2", fecha2)
    

    En esta ocasión, las fechas las he pasado como argumento a un método normal con el tipo de datos de las fechas (DateTime o Date en VB). Aclaro esto porque cuando se convierte un objeto del tipo fecha a una cadena (que es lo que supongo que hace el SQL cuando va a trabajar con la fecha) ese objeto del tipo fecha se convierte en una fecha y una hora (ver la figura 1).

    fechas_sql_02jun2016_peq
    Figura 1. Los objetos de tipo Date (DateTime) contienen la fecha y la hora.

    En este ejemplo, el valor pasado en el primer argumento tiene la fecha y la hora a las 12 de la madrugada, es decir a las 00:00:00 que es lo que ocurre cuando conviertes una fecha de cadena a tipo DateTime.

    Pero si la fecha la obtienes, por ejemplo, de un DateTimePicker o simplemente usando DateTime.Now que obtiene la fecha (y hora) actual. En el caso de que ese valor se obtenga a la hora en que escribo esto, mostrará un valor de fecha 2 de junio de 2016 y la hora 13 (01 PM) y 24 minutos con nosecuantos segundos (ver la figura 2).

    fechas_sql_02jun2016_2
    Figura 2. Now devuelve la fecha y hora actual completa.

    En este caso la propiedad Now del objeto fecha devuelve la fecha y la hora actual, y lo que hace la función esa que muestro en la figura 2 (NowDate) es devolver solo la fecha, sin hora… aunque la hora siempre está, pero si no se indica será 00:00:00 (media noche).

    Bueno, espero que te pueda servir de ayuda en casos como el que me pasó a mí, que aún habiendo un dato (de la misma fecha en la que hacía la comprobación) no me lo mostraba porque la hora era (por ejemplo las 9 de la noche) y esa fecha no era igual (o menor) que la que estaba guardada en la base de datos (que era el mismo día, pero a las cero horas), en fin…

    Nos vemos.
    Guillermo

  • Cuidado con las horas de las fechas en las consultas de SQL

    Pues eso… que esto de las fechas en las consultas es como el cuento de nunca acabar… al menos para mí, jeje.

    Lo que me ha pasado esta vez es que he estado usando fechas en una consulta y, como ya comenté hace años, la mejor forma de pasarlas a la consulta de SQL es usando parámetros, hasta aquí todo bien.

    ' Crear un nuevo objeto del tipo DataAdapter
    da = New SqlDataAdapter(sel, sCon)
    da.SelectCommand.Parameters.AddWithValue("@fecha1", fecha1)
    da.SelectCommand.Parameters.AddWithValue("@fecha2", fecha2)
    

    En esta ocasión, las fechas las he pasado como argumento a un método normal con el tipo de datos de las fechas (DateTime o Date en VB). Aclaro esto porque cuando se convierte un objeto del tipo fecha a una cadena (que es lo que supongo que hace el SQL cuando va a trabajar con la fecha) ese objeto del tipo fecha se convierte en una fecha y una hora (ver la figura 1).

    fechas_sql_02jun2016_peq
    Figura 1. Los objetos de tipo Date (DateTime) contienen la fecha y la hora.

    En este ejemplo, el valor pasado en el primer argumento tiene la fecha y la hora a las 12 de la madrugada, es decir a las 00:00:00 que es lo que ocurre cuando conviertes una fecha de cadena a tipo DateTime.

    Pero si la fecha la obtienes, por ejemplo, de un DateTimePicker o simplemente usando DateTime.Now que obtiene la fecha (y hora) actual. En el caso de que ese valor se obtenga a la hora en que escribo esto, mostrará un valor de fecha 2 de junio de 2016 y la hora 13 (01 PM) y 24 minutos con nosecuantos segundos (ver la figura 2).

    fechas_sql_02jun2016_2
    Figura 2. Now devuelve la fecha y hora actual completa.

    En este caso la propiedad Now del objeto fecha devuelve la fecha y la hora actual, y lo que hace la función esa que muestro en la figura 2 (NowDate) es devolver solo la fecha, sin hora… aunque la hora siempre está, pero si no se indica será 00:00:00 (media noche).

    Bueno, espero que te pueda servir de ayuda en casos como el que me pasó a mí, que aún habiendo un dato (de la misma fecha en la que hacía la comprobación) no me lo mostraba porque la hora era (por ejemplo las 9 de la noche) y esa fecha no era igual (o menor) que la que estaba guardada en la base de datos (que era el mismo día, pero a las cero horas), en fin…

    Nos vemos.
    Guillermo