Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: Bazooka 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
-
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
-
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
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
-
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
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
-
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