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 🙂 )

Esta entrada fue publicada en cosas técnicas, mis cosas y etiquetada , , , , , . Guarda el enlace permanente.

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

  1. Ariel dijo:

    Buen post Guille. Me gusto esa aclaranción de la época del Goto Error… jajajaja la era de la programación No Estructurada. Bien por el código que hace un uso eficiente de Try…Catch, lo que se recomienda en la programación Estructurada. Perfecto, simple y eficiente. Una maravilla.
    Saludos. 🙂

    • elGuille dijo:

      Gracias!

      ah, y el Using… importante también con este tipo de objetos… 😉

      Vamos que aunque uno use VB, no hay porqué hacer las cosas como dicen los “otros” que hacemos los Visual Basiqueros… jajajaja

  2. Gerardo dijo:

    Hola Guille

    En el siguiente parrafo

    “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!).”

    Mencionas que instalaste los de OLEDB porque no encontraste los de ODBC, mas sin embargo en tu ejemplo hacer referencia a una conexcion ODBC

    Using dbConn As New System.Data.Odbc.OdbcConnection(sConn)

    Pos ya no entendi

    • elGuille dijo:

      jajaja… tendré que añadir un comentario más y dejar el párrafo de esta forma:
      (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.

  3. Gerardo dijo:

    Si instalaste OLEDB se tiene que utilizar una conexion OLEDB o como te funciono si no tenias el driver ODBC para Visual FoxPro y tu conexion es ODBC

    Es pregunta y Duda

    • elGuille dijo:

      Ya he arreglado (al menos en tu comentario anterior) el texto… jajaja.
      La cuestión es 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 OLDB y usé una cadena de conexión diferente que en mi equipo (sin los drivers de VFP) sí funcionaba, pero no en el equipo de mi amigo que aún tenía los drivers de VFP que en su día instaló…

      ¿está ahora más claro? jajaja espero que sí… estos son los “despistes del Guille” y el creer que todos piensan o saben que es un despistado… jajajaja… ¡ay zeñó! en fin… 😀

  4. Gerardo dijo:

    Ok mas claro

    Pero entonces surge una duda si desinstalaste los OLEDB y no encontraste los ODBC como te funciono la conexion o que controladores tomaria???

    Que necio verdad

    Saludos GRC

    • elGuille dijo:

      No funcionaba usando la cadena de conexión para los drivers/controladores de VFP (Fox Pro), así que tuve que usar otra cadena, que utiliza unos drivers que (según parece) los instala el SQL o al menos en mi equipo están disponibles.
      Buscando por la cadena exacta de “{Microsoft dBASE Driver (*.dbf)}” me aparece esta página de la MSDN Library:
      SQLDriverConnect (dBASE Driver)
      así que… puedo usar esa conexión en mi equipo seguramente porque tengo instalado el SQLServer Express (porque el SQL Server normal no lo tengo instalado -creo-)

      ¿Más claro ahora? o aún… si quedan dudas… ¡hay que aclararlas! 😉

  5. Gerardo dijo:

    Ok

    Creo que quedo bastante claro y te agradezco tu tiempo.

    Solo un detalle de tu funcion para algun despistado, la primera linea.

    Datos = New DataSet

    Dim Datos = New DataSet

    Saludos GRC

    • elGuille dijo:

      Bueno, yo es que el DataSet (Datos) lo tengo declarado a nivel del formulario o de la clase, no recuerdo ahora cómo lo usé… pero sí, así está mejor para usar el código tal como lo muestro 🙂

Los comentarios están cerrados.