Etiqueta: .NET

Temas relacionados con .NET Framework (todas las versiones)

  • VarChar y NVarChar en SQL Server

    Actualizado el 21/Mar/2019 con los pasos para resolver el fallo que tenía de acceso a las bases de datos remotas y también con el enlace al código para VB y C#.

    Pues eso… el otro día estaba creando una base de datos de MySQL y me di cuenta que MySQL no tiene el tipo NVARCHAR o al menos a mí no me daba la opción de crear un campo con ese tipo, al menos desde el panel de control del hosting que utilizo (Domitienda.com), así que… utilicé VARCHAR, el problema que me temía que iba a tener era no poder usar las vocales acentuadas (con tilde), la eñe, etc. Pero resultó que sí… que lo aceptaba sin problemas.

    Así que, me puse a buscar en Internet a ver cuál era la diferencia entre VARCHAR y NVARCHAR, ya que yo siempre usaba NVARCHAR en mis bases de SQL Server (que es el tipo de base que uso, salvo excepciones muy, muy contadas) porque era el tipo que me permitía usar los caracteres especiales del idioma español (o al menos así lo entendí yo, que puede ser que lo entendiese mal… ).

    Pero resulta que si utilizo VARCHAR puedo indicar esos caracteres especiales sin mayor problema.

    Por supuesto la información que encontré hablando de esa diferencia entre esos dos tipos de datos era… bueno… no aclaratoria del todo… pero en realidad me daba igual lo que me quisieran decir, ya que yo he comprobado por mí mismo que se puede guardar algo así: Raúl Rodríguez López es de Valdepeñas en un campo del tipo VARCHAR.

    Un ejemplo para acceder a SQL Server y MySQL

    Aquí tienes una captura de un ejemplo que he hecho para mostrar que sí funciona eso de guardar los caracteres especiales, al menos los usados en español.

    El código lo publicaré otro día, ya que es tarde y además no me funciona el código para acceder a las bases de datos remotas (en el hosting de Domitienda), seguramente habré configurado algo mal, ya que a otras que tengo en el mismo hosting si que puedo acceder…

    Nota del 21 de Marzo:

    Según parece resulta que en el «plesk» del hosting no permite usar el mismo nombre de usuario para varias bases de datos o bien la longitud de la contraseña debe ser menor de la que usé… en cualquier caso lo he solucionado haciendo lo siguiente:

    He creado dos usuarios diferentes, el de la base de datos de SQL Server se llama elGuille_infoSQL y el de MySQL se llama elGuille_infoMy.

    He usado una clave más corta.

    Y ahora todo funciona bien… o casi… ya que añadí un campo DATETIME a la base de MySQL y da error al convertir el contenido de la base de datos a un tipo DateTime de .NET, así que… lo he creado como VARCHAR(20).

    Otra cosa con la que me he encontrado con la consulta de MySQL es que no acepta TOP para indicar el número de filas a devolver, en su lugar he usado LIMIT y ya va bien.

    En la captura de la Figura 2 puedes ver la aplicación totalmente operativa y accediendo a las bases de datos remotas.

    Si te fijas en los valores mostrados al final con todo a cero, eso era lo que había añadido usando el tipo de datos DATETIME en MySQL, después al añadirlo como VARCHAR ya se muestra bien.

    El código de VB y C# lo puedes ver en la entrada publicada el 21 de marzo: VarChar y NVarChar en SQL Server y MySQL el código para VB y C#.

    Figura 2. La aplicación operativa con acceso remoto después de los cambios hechos en el hosting.
    Figura 2. La aplicación operativa con acceso remoto después de los cambios hechos en el hosting.

    Figura 1. Formulario de prueba
    Figura 1. El formulario de prueba

    Los datos mostrados en la figura 1 son de una base de datos de SQL Server usada localmente, el mensaje de error que se muestra es el devuelto por el servidor de MySQL.

    Lo importante es que puedes comprobar que tanto el campo VARCHAR como NVARCHAR muestran las vocales con tilde y la eñe.

    Seguramente si uso caracteres de otros idiomas como el CHINO o RUSO no se guardarían bien en el VARCHAR… no lo sé porque no lo he probado… 😉

    Pues esto es todo por hoy… en los enlaces puedes ver más información sobre esos tipos de datos (en la documentación de SQL Server) y lo que cuentan en algunos sitios sobre la diferencia entre ellos.

    Este enlace es sobre VARCHAR en la documentación de MySQL.

    A ver si el jueves próximo (día 21, luna llena, por más señas) te pongo el código de ejemplo de la aplicación que guarda esos caracteres en los dos tipos de datos y como de costumbre tanto para Visual Basic como para C#.

    Nos vemos.
    Guillermo

    Nota:
    Según el panel de control la versión de MySQL es:

    mysql1.servidoreswindows.net
    Versión del servidor: 5.1.73-log

  • DoEvents para aplicaciones WPF

    Pues eso… que en las aplicaciones de Windows Presentation Foundation (WPF) no podemos usar el equivalente a DoEvents de Windows Forms, simplemente porque no existe esa funcionalidad para WPF, pero no te preocupes porque aquí te explico cómo crear un método DoEvents listo para usar en las aplicaciones de WPF, por supuesto con el código del VB y C#.

    Yo utilizo DoEvents en las ocasiones que quiero refrescar la pantalla (formulario o ventana) de la aplicación, por ejemplo cuando se está haciendo un proceso largo para que no se quede congelada la aplicación.

    Y anoche me ocurrió eso mientras ejecutaba una aplicación (de WPF) que me fabriqué para copiar el contenido de una lista de canciones (PlayList tipo m3u) en una carpeta. Y como el disco usado para guardar los MP3 era un disco externo, pues… aparte de que eran muchas canciones (354), pues… parecía que la aplicación fallaba, ya que no mostraba la canción que estaba copiando y… pues eso… que hasta yo pensé que me había equivocado escribiendo el código… Angel

    Así que… sabiendo que DoEvents no está definido en WPF y después de probar con que tampoco hay Refresh en los controles de WPF, probé con Thread.Sleep que no solucionó el problema (y no era plan de crear un temporizador), así que… ¡a buscar en Internet!

    Y dio resultado la búsqueda, concretamente en esta página:
    Implement Application.DoEvents in WPF, ¿el problema? ninguno, salvo que, como suele ocurrir por los interneses, todo está con ejemplos para C#, así que… a convertir el código encontrado.

    Este es el código de esa página para simular el DoEvents (en C#):

    public static void DoEvents()
        {
            Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background,
                    new EmptyDelegate(delegate{}));
        }
    
    

    En otra parte del código debes tener la definición de EmptyDelegate:

    private delegate void EmptyDelegate();
    

    No me sonó demasiado a chino mandarín ya que algo parecido usé hace muuuuuuchos años para llamar a otro control desde el método de evento de un temporizador:
    24- Acceder a un control desde un evento de un timer, pero ya ni me acordaba Eye rolling smile

    Y esta es la versión para Visual Basic .NET:

    ' Adaptado de:
    ' http://www.java2s.com/Tutorial/CSharp/0470__Windows-Presentation-Foundation/
    '   ImplementApplicationDoEventsinWPF.htm
    
    Private Delegate Sub EmptyDelegate()
    
    Private Sub DoEvents()
        Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background,
                                            New EmptyDelegate(Sub()
                                                              End Sub))
    End Sub
    

    Te tienes que fiar de mi palabra, pero sin el DoEvents, al pulsar en el botón Copiar la aplicación parece como si se hubiese colgado… hasta pasado un buen rato no termina… (Figura 1)

    Figura 1. Sin el DoEvents, después de pulsar en Copiar la aplicación se queda congelada
    Figura 1. Sin el DoEvents, después de pulsar en Copiar la aplicación se queda congelada

    Sin embargo, poniendo el DoEvents, se va mostrando el progreso de copia. Y de eso se trata… que se vea lo que está haciendo Winking smile

    Pues… ¡ya está! esto es todo…

    Nos vemos.
    Guillermo

  • Si quieres que tu aplicación se muestre en el monitor externo dile que se centre en la pantalla (CenterScreen)

    Pues eso… que estuve un tiempo buscando soluciones para que se mostrasen mis aplicaciones en el monitor secundario (que es el que uso como principal) y resulta que la solución es más simple que todo eso… sí, solo con indicarle que se centre en la pantalla (CenterScreen) es suficiente Winking smile

    Y esto vale tanto para aplicaciones de Windows Forms como para las de WPF (Windows Presentation Foundation).

    En WPF lo haces con este código en el diseñador de la ventana (Window):

    WindowStartupLocation = "CenterScreen"

    En WinForms asigna a la propiedad StartPosition del formulario de inicio el valor CenterScreen.

    Y ya está… ya no tengo más que contarte Winking smile

    Nos vemos.
    Guillermo