Autor Tema: Diferenciar error devuelto por Mysql  (Leído 3204 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Diferenciar error devuelto por Mysql
« en: Noviembre 13, 2015, 07:11:54 pm »
Hola gente, estoy utilizando MySql en un proyecto y se me presenta un problema que no puedo resolver por eso los molesto.
Estoy utilizando para conectarme ADO y al entrar al programa necesito verificar que exista un servidor activo como por ejemplo WampServer y que si está activo verificar que exista la Base de Datos para crearla al vuelo.

El Tema es que me devuelve el error -2147467259  tanto si esta apagado el WampServer o si está prendido pero la Base de Datos no se encuentra y necesito ejecutar una accion diferente por cada situación!.

Ojala me puedan ayudar ..

Gracias

'+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
Public cnADO As ADODB.Connection    '// Conexion ADO
Public rsADO As ADODB.Recordset     '// RecordSet ADO
Public strSql As String             '// Parametro para MySQL
Public ComandoSQL As String         '// Comando MySQL
Public CADENA_CONEX As String       '// CADENA de CONEXion


Public Sub ConectarADO()
    On Error GoTo ErrorHandler
    If (cnADO Is Nothing) Then ' SI LA CONEXION ESTA DESACTIVA CREARLA
       
        Set cnADO = New ADODB.Connection    '// Crear la nueva conexion
        Set rsADO = New ADODB.Recordset     '// Crear nuevo recordset
        rsADO.CursorLocation = adUseClient  '// Tipo de cursor a utilizar
        cnADO.ConnectionString = CADENA_CONEX
        cnADO.Open                          '// Abrir la nueva conexion
    Else
       If rsADO.State = 1 Then
            rsADO.Close
       Else
        '
       End If
    End If
ErrorHandler:
   
    If Err <> 0 Then
       MsgBox Err.Number
        Debug.Print Err.Number
       '////////////////////////////////////////////////////////////////////////////////////////////////////////////
       'ACA NECESITARIA DIFERENCIAR SI EL ERROR ES POR EL SERVIDOR DESCONECTADO O PORQUE LA BASE DE DATOS NO EXISTE
       '////////////////////////////////////////////////////////////////////////////////////////////////////////////
        'EXITO = True
        Resume Next
    End If

End Sub
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Diferenciar error devuelto por Mysql
« Respuesta #1 en: Noviembre 13, 2015, 08:46:31 pm »
Anticipo que no sé cómo hacer lo que preguntás y que a lo mejor digo una burrada. El que avisa no traiciona jejeje
¿Si probás intentando conectar a una base que sepas que existe (por ejemplo, la de usuarios o alguna de las que crea MySQL al ser instalado)? En esa primera instancia detectarías si el servicio está corriendo o no, es decir, si se conecta a esa base de datos, está corriendo. En ese caso (si se conecta), intentás conectar a la base de datos que te interesa y ahí sabrás si existe o no. Si en la primera instancia no conecta a la base, podrás dar por seguro que no está corriendo el servicio.
La otra que se me ocurre es que hagas el intento de crear la base de datos de todas maneras. Si te devuelve el mismo error que mencionás, querrá decir que no está corriendo el servicio, ya que imagino que si está prendido y recibe la petición de crear una base de datos existente devolverá otro.
Conste que avisé...

Jerónimo

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Diferenciar error devuelto por Mysql
« Respuesta #2 en: Noviembre 14, 2015, 11:36:32 am »
Se me ocurre asi capturar la descripcion del error y poner en un select case y si hay un error segun la descripcion hacer tal cosa


Código: (VB) [Seleccionar]
    ErrorHandler:
   
    If Err <> 0 Then

        Dim xError As String
        xError = Err.Description
               
        Select Case xError
       
            Case "[MySQL][ODBC 5.1 Driver]Unknown database 'control_hotel'"
               
                MsgBox "No existe la bd", vbInformation
               
            Case "[MySQL][ODBC 5.1 Driver]Can't connect to MySQL server on 'localhost' (10061)"
               
                MsgBox "No se puede conectar a la bd", vbInformation
               
            Case "[Microsoft][Administrador de controladores ODBC] No se encuentra el nombre del origen de datos y no se especificó ningún controlador predeterminado"
               
                MsgBox "No existe el controlador ODBC", vbInformation
           
        End Select

    End If
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Diferenciar error devuelto por Mysql
« Respuesta #3 en: Noviembre 14, 2015, 02:46:08 pm »
Bueno profundice un poco mas esto y hice asi como veran ahi para capturar cada error cambie el ConnectionString a proposito y abajo explico por que da el error

Lo correcto es asi y suponiendo que todo corre bien
cnADO.ConnectionString = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=control_hotel; User=root;Password=;Option=3;"


ConnectionString.: Driver={MySQL ODBC 5.100 Driver};Server=localhost;Database=control_hotel;User=root;Option=3;
El error es......: El ODBC es otra version
Descripcion......: [Microsoft][Administrador de controladores ODBC] No se encuentra el nombre del origen de datos y no se especificó ningún controlador predeterminado
Native...........:  0
Numero...........: -2147467259
Source...........: Microsoft OLE DB Provider for ODBC Drivers
State............: IM002
------------------------------------------------------------------------------------------------------------------------------------------------------
ConnectionString.: Driver={MySQL ODBC 5.1 Driver};Server=localhost1000;Database=control_hotel;User=root;Option=3;
El error es......: El IP del servidor no se encuentra
Descripcion......: [MySQL][ODBC 5.1 Driver]Unknown MySQL server host 'localhost1000' (11001)
Native...........:  2005
Numero...........: -2147467259
Source...........: Microsoft OLE DB Provider for ODBC Drivers
State............: S1000
------------------------------------------------------------------------------------------------------------------------------------------------------
ConnectionString.: Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=control_hotel1000;User=root;Option=3;
El error es......: La Base Datos no se encuentra
Descripcion......: [MySQL][ODBC 5.1 Driver]Unknown database 'control_hotel1000'
Native...........:  1049
Numero...........: -2147467259
Source...........: Microsoft OLE DB Provider for ODBC Drivers
State............: S1000
------------------------------------------------------------------------------------------------------------------------------------------------------
ConnectionString.: Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=control_hotel;User=root;Option=3;
El error es......: Ahora desactive el servicio de MySQL a proposito
Descripcion......: [MySQL][ODBC 5.1 Driver]Can't connect to MySQL server on 'localhost' (10061)
Native...........:  2003
Numero...........: -2147467259
Source...........: Microsoft OLE DB Provider for ODBC Drivers
State............: S1000

Y como verar con el NativeError se puede diferenciar cada error.

Aca el code

Código: (VB) [Seleccionar]
Public Sub ConectarADO()
   
    On Error GoTo ERR_CommandTimeout:
   
    Set cnADO = New ADODB.Connection
    Set rsADO = New ADODB.Recordset
   
    rsADO.CursorLocation = adUseClient
    cnADO.ConnectionString = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=control_hotel; User=root;Password=;Option=3;"
    cnADO.Open
       
GoTo CleanUp:

ERR_CommandTimeout:

    Dim oErr As ADODB.Error
   
    For Each oErr In cnADO.Errors
       
        Debug.Print "ConnectionString.: "; cnADO.ConnectionString
        Debug.Print "El error es......: "; ":D"
        Debug.Print "Descripcion......: "; oErr.Description
        Debug.Print "Native...........: "; oErr.NativeError
        Debug.Print "Numero...........: "; oErr.Number
        Debug.Print "Source...........: "; oErr.Source
        Debug.Print "State............: "; oErr.SQLState
        Debug.Print String$(150, "-")
       
        If oErr.NativeError = "0" Then
            MsgBox "El ODBC es otra version instalar la version correcta", vbInformation
        End If
       
        If oErr.NativeError = "2005" Then
            MsgBox "El servidor no se encuentra", vbInformation
        End If

        If oErr.NativeError = "1049" Then
            MsgBox "La base datos no se encuentra", vbInformation
        End If
       
        If oErr.NativeError = "2003" Then
            MsgBox "No se puede conectar al servidor", vbInformation
        End If

    Next oErr
   
CleanUp:
    Set cnADO = Nothing
End Sub
« última modificación: Noviembre 14, 2015, 02:51:04 pm por E N T E R »
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Diferenciar error devuelto por Mysql
« Respuesta #4 en: Noviembre 17, 2015, 08:27:56 am »
Muchas Gracias amigo no respondi rápido por que andaba viajando!!!
Muy bueno el allazgo que hiciste y desde ya que lo pongo en práctica.
De igual manera te cuento que lo habia solucionado como dijo geronimo aunque no habia leído lo que l propuso es exactamente lo que se me ocurrio ..
Me puse a mirar las Base de Datos que habia y veo esa que crea MySql Information_Schema y con eso ya tenia mi solución.
Pero la que planteas parece ser más piola.

Saludos y gracias

Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.