Autor: elGuille

  • probar varias cadenas de conexión si una da error, y no morir en el intento

     

    Pues eso… que estaba modificando/probando la aplicación esa que en su día te comenté para acceder a los ficheros de FoxPro (o dBase) con la extensión DBF y resulta que me dio error al conectar a la base de datos, concretamente este:

    ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

    Así que… me fui a ver mi artículo (Acceso a ficheros dBase (.dbf) desde Visual Basic .NET y C#) y usé otra cadena de conexión (todo esto después de probar a instalar los drivers de VFP -que por cierto me equivoqué e instalé y los de OLEDB en vez de los de ODBC porque no encontré los drivers de este último… y ¡me lié! po zí…  pero bueno, ese es otro tema… jum!).
    La cuestión es que tuve que desinstalar los drivers de OLEDB ya que la cadena de conexión y el tipo de datos que quería usar eran los de ODBC.

    Nota aclaratoria del 23/Abr/2015 11:15
    Aparte de agregar un nuevo comentario al párrafo anterior, quiero aclararte que:
    Busqué los drivers de ODBC (que son los que yo quería utilizar) y por error me bajé los de OLEDB y después de instalarlos y probar “con la conexión ODBC” de que no funcionaba -lógico, no son los adecuados- desinstalé los drivers de OLEDB y usé una cadena de conexión diferente que en mi equipo sí funcionaba (sin los drivers de VFP), pero no en el equipo de mi amigo que aún tenía los drivers de VFP que en su día instaló…

    Para tu información la cadena que inicialmente estaba usando (y la que funciona en el equipo de mi colega) es esta:

    "Driver={Microsoft Visual FoxPro Driver};
    SourceType=DBF;
    SourceDB=" & sBase & ";"

    Y la otra que probé y a mi sí me funcionó es esta otra:

    "Driver={Microsoft dBASE Driver (*.dbf)};
    DriverID=277;
    Dbq=" & sBase & ";"

    La cuestión es que la de Visual FoxPro Driver a mi no me iba y la de dBASE driver no le iba a mi colega Manolo (le da el error de la figura 1).

    error dBASE en equipo Manolo

    Figura 1. Error del controlador/driver dBASE

    Así que… tenía que hacer algo para usar uno en un equipo y otro en el otro… y antes de ponerme a saber el nombre del equipo y demás, me dije… jum! esta vez voy a probar primero lo más simple y después ya veré si me tengo que complicar la vida con otras cosas.

    Y lo más simple para mi es: ¡probar si puede conectar con una cadena de conexión y si no puede, entonces probar otra! y…

    (Ahora, al escribir esto último me recuerda mis tiempos de programador de Quick BASIC y el uso y "mal uso" de ON ERROR RESUME NEXT o lo que es lo mismo: si se produce un error que continúe girando el mundo… ¡hasta que se pare! jaja… en fin…)

    Y eso he hecho y eso es lo que me funciona, mi colega aún no lo habrá probado, pero seguro que a él también le funciona; así que… si funciona… ¡todos contentos! 🙂

    (y sobre todo, él puede seguir trabajando, yo no, pero él sí jeje)

    Y este es el código que he usado (por ahora en Visual Basic .NET ya que mis proyectos los suelo hacer siempre para Visual Basic -salvo excepciones).

     

    El código de la función LeerBases(path) para Visual Basic .NET

    Public Shared Function LeerBases(ByVal dirDBF As DirectoryInfo) As DataSet
        Datos = New DataSet
    
        Dim sBase As String = dirDBF.FullName
        Dim sConn As String
    
        Dim ficsDbf() As FileInfo = dirDBF.GetFiles("*.dbf")
        If ficsDbf.Length = 0 Then Return Datos
    
        ' Utilizar varias conexiones y probar con las siguientes si da error (14/Abr/15)
        Dim cadenasConexión() As String = {"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" & sBase & ";",
                                           "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & sBase & ";"}
    
        Dim intentosConexion As Integer = 0
        Dim hayError As Boolean = False
        Dim mensajeError As String = ""
    
        Do
            sConn = cadenasConexión(intentosConexion)
    
            Using dbConn As New System.Data.Odbc.OdbcConnection(sConn)
                Try
                    dbConn.Open()
    
                    For Each fi As FileInfo In ficsDbf
                        Dim sSelect As String = "SELECT * FROM " & fi.Name
    
                        Dim da As New System.Data.Odbc.OdbcDataAdapter(sSelect, dbConn)
                        Dim dt As New DataTable
    
                        da.Fill(dt)
                        If dt.Rows.Count > 0 Then
                            Datos.Tables.Add(dt)
                        End If
                    Next
    
                    dbConn.Close()
    
                    hayError = False
    
                    ' Salir del bucle,
                    ' no sea que haya más opciones de conectar y no es plan...
                    Exit Do
    
                Catch ex As Exception
                    mensajeError = _
                        "Error al abrir la base de datos" & vbCrLf &
                        ex.Message & vbCrLf &
                        "Usando: '" & cadenasConexión(intentosConexion) & "'"
                    hayError = True
    
                    ' Este es el mensaje de error que me muestra:
                    ' ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
                End Try
            End Using
    
            intentosConexion += 1
        Loop While intentosConexion < cadenasConexión.Length
    
        If hayError Then
            System.Windows.Forms.MessageBox.Show(mensajeError,
                                                 "Error al conectar a los datos de DBF",
                                                 System.Windows.Forms.MessageBoxButtons.OK,
                                                 System.Windows.Forms.MessageBoxIcon.Exclamation)
        End If
    
        Return Datos
    End Function
    
    
    

     

    Y esto es todo amigos… 🙂

    Espero que te sea de utilidad y que si así lo es, me invites a un té o un refresco… y como va a ser complicado que nos veamos para esa invitación (y no es plan de esperar a que eso ocurra en otra vida), puedes invitarme usando el botón de Donar ese que tengo en mi blog, allí, arriba a la derecha o en mi sitio, sí, ese que está allí arriba, donde dice eso de Donativo para el sitio de elGuille.

    Gracias.

     

    Nos vemos.

    Guillermo

    Este artículo también está publicado en mi sitio:

    http://www.elguille.info/NET/ADONET/probar-varias-cadenas-de-conexion-si-una-da-error-y-no-morir-en-el-intento.aspx

    ( En realidad obtiene el contenido desde aquí, de mi blog 🙂 )

  • como conectar a una base de datos de MySQL en un servidor Web desde .NET

     

    Pues eso… hace unos días he estado haciendo una pequeña aplicación para acceder a una base de datos de MySQL creada en un servidor web de Domitienda y voy a aprovechar para comentarte las cosillas que he hecho (como conectar a una BBDD de MySQL, enviar emails, obtener datos de tres tablas diferentes pero que había que relacionar para sacar lo que interesaba, etc.) y la primera fue lo más importante: Conectar con una base de datos de MySQL con Visual Basic .NET (o .NET en general).
    Y esto es lo que te voy a contar en este "artículo" de hoy lunes 13 de abril de 2015.

    Los requisitos

    Lo primero que deberías hacer es descargarte la DLL (librería/biblioteca) de MySQL para usar con Visual Studio, bueno, en realidad lo que yo me iba a bajar el Connector .NET, concretamente la versión 6.9.6 porque decía que la versión 6.7 el Connector/Net no incluye el "MySQL for Visual Studio integration", así que ni me puse a "investigar" a qué se refería, por tanto me bajé el MySQL for Visual Studio, concretamente la versión web community 5.6.23.0 (a la hora de escribir esto está la versión 5.6.24.0).

    Nota:
    El descargar la versión "web community" es porque tenía conexión a internet y así solo tenía que descargar 1.6MB frente a los 286,7MB de la versión off-line.

    Es un MSI installer y te da un montón (o dos o tres o cuatro, pal caso es lo mismo) de opciones, pero solo usé la del Connector o lo que pusiera en las opciones de instalación.

     

    Añadir la referencia de MySql.Data al proyecto

    Una vez instalado, en el proyecto desde el que quieras acceder a la base de datos de MySQL le agregas la referencia correspondiente.
    En mi caso usé la versión 4.5 ya que el proyecto también usaba el .NET Framework 4.5 (ver la figura 1).

    MySqlData referencia
    Figura 1. Referencia al ensamblado de MySql.Data versión 6.9.5

    Y una vez que hemos agregado la referencia al ensamblado MySql.Data ya podemos acceder a las clases de conexión y demás, que están en el espacio de nombres MySql.Data.MySqlClient.

    Y el resto… como de costumbre… pero no te preocupes te voy a poner el código (primero para VB y después para C#) de cómo usar la conexión y acceder a una tabla y demás, pero eso será… ¡ma-ña-na! 🙂

    Bueno, vale, al menos te pondré el código de cómo conectar a la base de datos.

     

    Conectar a la base de datos de MySQL desde Visual Basic .NET

    Yo suelo usar un método en una clase con métodos compartidos (en VB puedes usar un módulo, pero yo uso una clase para después convertir fácilmente el código a C#), el método es una función llamada CadenaConexion que devuelve una cadena con la cadena de conexión generada por la clase ConnectionStringBuilder, en realidad la clase se llama MySqlConnectionStringBuilder, pero si has usado conexión a SQL Server sabrás que en ese caso el nombre es SqlConnectionStringBuilder.

    Para poder acceder a las clases de MySql.Data debes añadir una importación de espacios de nombres a MySql.Data.MySqlClient:

    ' Para Visual Basic:
    Imports MySql.Data.MySqlClient
    
    // Para C#:
    using MySql.Data.MySqlClient;

    Y esta es la definición del método que está en una clase (class) de VB y por eso el método lo he definido como Shared (static en C#) para que lo puedas usar simplemente anteponiendo el nombre de la clase y sin necesidad de crear nuevas instancias ni nada de eso:

    El código del método CadenaConexion para Visual Basic:

    ''' <summary>
    ''' La cadena de conexión a la base de datos
    ''' </summary>
    Public Shared Function CadenaConexion() As String
        Dim csb As New MySqlConnectionStringBuilder
        csb.Server = "mysql3.servidoreswindows.net"
        csb.Database = "nombre_Base_Datos"
        csb.UserID = "nombre_usuario_de_la_base"
        csb.Password = "la_clave_del_usuario_de_la_base"
        csb.IntegratedSecurity = False
    
        Return csb.ConnectionString
    End Function
    
    

    El método CadenaConexion para C#:

    /// <summary>
    /// La cadena de conexión a la base de datos
    /// </summary>
    public static string CadenaConexion()
    {
        MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder();
        csb.Server = "mysql3.servidoreswindows.net";
        csb.Database = "nombre_Base_Datos";
        csb.UserID = "nombre_usuario_de_la_base";
        csb.Password = "la_clave_del_usuario_de_la_base";
        csb.IntegratedSecurity = false;
    
        return csb.ConnectionString;
    }
    

     

    Y esto es todo por hoy… mañana (seguramente)… más… 😉

     

    Nos vemos.

    Guillermo

    Este artículo también está publicado en mi sitio:

    http://www.elguille.info/NET/ADONET/MySQL_CadenaConexion.aspx

    ( En realidad obtiene el contenido desde aquí, de mi blog 🙂 )

  • si no ves los subtítulos en tu Smart TV…

     

    Pues eso… que tenía unas cuantas grabaciones (AVI, MP4) en un pendrive, con sus correspondientes ficheros de subtítulos (SRT) y al conectarlos a una SmartTV no los mostraba.

    Comprobé las cosas básicas:

    -Que el fichero de subtítulos tenía el mismo nombre que el video (creo que no es necesario, al menos en el Telefunken en el que lo he probado, ya que te permite seleccionar el fichero que quieres usar, pero… mejor hacerlo como debe ser… ya que así también te sirve de forma automática si lo quieres ver con una aplicación de escritorio, tal como FLV and Media Player o VLC media player).
    -Que el fichero de subtítulos estuviera en la misma carpeta que el video.

    Pues bien, resulta que el fallo estaba en el formato con el que está guardado el fichero, concretamente los ficheros que funcionaban estaban guardados como ANSI / PC y los que no me funcionaban como UTF8 / UNIX, incluso tampoco me funcionaban los guardados como ANSI / UNIX.

    Solución: Guardarlos con el formato PC (ya sea ANSI o UTF8)

    Esto lo puedes hacer con cualquier editor de textos (incluso el Notepad), para ello tienes que abrir el fichero en el editor de texto, seleccionar la opción de Guardar como… (Save As…) y elegir el formato adecuado (ver la figura 1).

    Notepad_saveAs

    Nota:
    La diferencia entre los formatos PC y UNIX es que en el primero (PC) cada cambio de línea se codifica con 0A 0D (LF CR) y en el formato UNIX solo se usa el 0A (LF).
    LF = Line Feed (salto de línea) (\n) (0A, 10)
    CR = Carriage Return (retorno de carro) (\r) (0D, 13)

    Más info en Wikipedia.

     

    Espero que te sirva…

    Nos vemos.
    Guillermo

    P.S.
    He creado una pequeña aplicación de escritorio (Windows Forms) para hacer esta conversión de forma automática en todos los ficheros que indiques de un directorio.
    ConvertirFormatoFichero

    Si la quieres, dame un toque a mi correo con el asunto "quiero la app para convertir ficheros a formato PC" y te daré el enlace… (que cuando lo tenga ya lo pondré aquí jeje)
    mensaje_elguille.info