none
Comprobar conexion base de datos RRS feed

  • Pregunta

  • Quiero que en tiempo de ejecucion mi aplicacion este verificando si la base de datos esta conectada. es decir que mientras uso mi programa si en algun momento el servicio de sql o mi base de datos deja de responder, pueda mostrar en un label del status bar un mensaje ejemplo: "Conectado", "Desconectado", "Conectando"

    he probado poniendo un timer y que cada segundo verifique si la conexion esta abierta pero no funciona

    if bd.conexion.state = conetion.open then

    status_msg = "Conectado"

    else

    status_msg = "Desconectado"

    y no me funciona, tienen alguna forma mas viable?


    Alexander Jimenez

    sábado, 2 de abril de 2016 4:15

Respuestas

  • "AJ Designs" preguntó:

    > Quiero que en tiempo de ejecucion mi aplicacion este verificando si la base
    > de datos esta conectada. es decir que mientras uso mi programa si en algun
    > momento el servicio de sql o mi base de datos deja de responder, pueda mostrar
    > en un label del status bar un mensaje ejemplo: "Conectado", "Desconectado",
    > "Conectando"
    >
    > he probado poniendo un timer y que cada segundo verifique si la conexion esta
    > abierta pero no funciona
    >
    > if bd.conexion.state = conetion.open then

    Mediante la propiedad State de un objeto SqlConnection, no vas a poder verificar si el servicio de SQL Server está iniciado, pausado, detenido, o en el estado en el que actualmente se encuentre. Para ello tienes que acudir a la propiedad Status de un objeto  ServiceController.

    Referencia en tu proyecto el ensamblado System.System.ServiceProcess.dll, e inserta en tu formulario el siguiente código fuente:

    Imports System.Data.SqlClient
    Imports System.ServiceProcess
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Configurar el control Timer.
            Timer1.Interval = 1000 ' Un segundo
    
            ' Establecer el controlador para el evento Tick del control Timer.
            AddHandler Timer1.Tick, AddressOf TimerOnTick
    
            ' Iniciar el temporizador.
            Timer1.Start()
    
        End Sub
    
        Private Sub TimerOnTick(sender As Object, e As EventArgs)
    
            Dim status As ServiceControllerStatus = GetStatusSqlServerService()
    
            If (status = ServiceControllerStatus.Running) Then
                Label1.Text = "Conectado"
            ElseIf (status = ServiceControllerStatus.Paused) Then
                Label1.Text = "Pausado"
            ElseIf (status = ServiceControllerStatus.Stopped) Then
                Label1.Text = "Detenido"
            Else
                Label1.Text = status.ToString()
            End If
    
        End Sub
    
        ''' <summary>
        ''' Obtiene el estado del servicio correspondiente
        ''' a la instancia local de SQL Server.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Shared Function GetStatusSqlServerService() As ServiceControllerStatus
    
            Dim sc As New ServiceController("SQL Server (MSSQLSERVER)")
            Return sc.Status
    
        End Function
    
    End Class
    

    De esta manera en el control Label1 te aparerá el estado actual del servicio correspondiente a la instancia local de Microsoft SQL Server, el cual se llama MSSQLSERVER. Si por casualidad estás utilizando SqlExpress, su servicio se llamará SQL Server (SQLExpress).

    Y si también deseas conocer el estado actual de la conexión (cuestión ésta que no entiendo muy bien para qué lo quieres conocer, porque se supone que el estado de la misma SIEMPRE tiene que ser CERRADA, salvo el tiempo INDISPENSABLE que necesariamente tiene que estar abierta para ejecutar la consulta de acción o de selección que se indique), puedes hacerlo en su evento StateChange.

    Suponiendo que a nivel del formulario tienes declarado un objeto SqlConnection:

        Private cnn As SqlConnection

    instalarías su controlador para el evento StateChange como indico a continuación:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       
            ' Configurar un objeto Connection
            cnn = New SqlConnection(cadenaConexion)
    
            ' Instalar el controlador para el evento StateChange del objeto Connection.
            AddHandler cnn.StateChange, AddressOf ConnectionOnStateChange
    
        End Sub
    
        Private Sub ConnectionOnStateChange(sender As Object, e As StateChangeEventArgs)
    
            Label2.Text =
            String.Format("El estado original de la conexión era: {0},{1}y su estado actual es: {2}",
                          e.OriginalState, Environment.NewLine, e.CurrentState)
    
        End Sub
    

    Cada vez que abras o cierres la conexión, se ejecutará su evento StateChange, es decir, el código fuente existente en el procedimiento ConnectionOnStateChange. Fíjate que en el ejemplo he indicado que el mensaje se muestre en otro control Label diferente (Label2) al utilizado para mostrar los mensajes del servicio de SQL Server, porque al éstar el temporizador ejecutándose cada segundo, pocos mensajes vas a poder ver del estado de la conexión si utilizas para ambos mensajes el mismo control Label. ;-)

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    sábado, 2 de abril de 2016 8:58
    Moderador

Todas las respuestas

  • Hola.

    ¿Tienes algún bloque de código para ello?

    ¿Ya activaste el Timer para desencadenar el evento?


    Antonio Mata

    sábado, 2 de abril de 2016 4:56
  • "AJ Designs" preguntó:

    > Quiero que en tiempo de ejecucion mi aplicacion este verificando si la base
    > de datos esta conectada. es decir que mientras uso mi programa si en algun
    > momento el servicio de sql o mi base de datos deja de responder, pueda mostrar
    > en un label del status bar un mensaje ejemplo: "Conectado", "Desconectado",
    > "Conectando"
    >
    > he probado poniendo un timer y que cada segundo verifique si la conexion esta
    > abierta pero no funciona
    >
    > if bd.conexion.state = conetion.open then

    Mediante la propiedad State de un objeto SqlConnection, no vas a poder verificar si el servicio de SQL Server está iniciado, pausado, detenido, o en el estado en el que actualmente se encuentre. Para ello tienes que acudir a la propiedad Status de un objeto  ServiceController.

    Referencia en tu proyecto el ensamblado System.System.ServiceProcess.dll, e inserta en tu formulario el siguiente código fuente:

    Imports System.Data.SqlClient
    Imports System.ServiceProcess
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Configurar el control Timer.
            Timer1.Interval = 1000 ' Un segundo
    
            ' Establecer el controlador para el evento Tick del control Timer.
            AddHandler Timer1.Tick, AddressOf TimerOnTick
    
            ' Iniciar el temporizador.
            Timer1.Start()
    
        End Sub
    
        Private Sub TimerOnTick(sender As Object, e As EventArgs)
    
            Dim status As ServiceControllerStatus = GetStatusSqlServerService()
    
            If (status = ServiceControllerStatus.Running) Then
                Label1.Text = "Conectado"
            ElseIf (status = ServiceControllerStatus.Paused) Then
                Label1.Text = "Pausado"
            ElseIf (status = ServiceControllerStatus.Stopped) Then
                Label1.Text = "Detenido"
            Else
                Label1.Text = status.ToString()
            End If
    
        End Sub
    
        ''' <summary>
        ''' Obtiene el estado del servicio correspondiente
        ''' a la instancia local de SQL Server.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Shared Function GetStatusSqlServerService() As ServiceControllerStatus
    
            Dim sc As New ServiceController("SQL Server (MSSQLSERVER)")
            Return sc.Status
    
        End Function
    
    End Class
    

    De esta manera en el control Label1 te aparerá el estado actual del servicio correspondiente a la instancia local de Microsoft SQL Server, el cual se llama MSSQLSERVER. Si por casualidad estás utilizando SqlExpress, su servicio se llamará SQL Server (SQLExpress).

    Y si también deseas conocer el estado actual de la conexión (cuestión ésta que no entiendo muy bien para qué lo quieres conocer, porque se supone que el estado de la misma SIEMPRE tiene que ser CERRADA, salvo el tiempo INDISPENSABLE que necesariamente tiene que estar abierta para ejecutar la consulta de acción o de selección que se indique), puedes hacerlo en su evento StateChange.

    Suponiendo que a nivel del formulario tienes declarado un objeto SqlConnection:

        Private cnn As SqlConnection

    instalarías su controlador para el evento StateChange como indico a continuación:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       
            ' Configurar un objeto Connection
            cnn = New SqlConnection(cadenaConexion)
    
            ' Instalar el controlador para el evento StateChange del objeto Connection.
            AddHandler cnn.StateChange, AddressOf ConnectionOnStateChange
    
        End Sub
    
        Private Sub ConnectionOnStateChange(sender As Object, e As StateChangeEventArgs)
    
            Label2.Text =
            String.Format("El estado original de la conexión era: {0},{1}y su estado actual es: {2}",
                          e.OriginalState, Environment.NewLine, e.CurrentState)
    
        End Sub
    

    Cada vez que abras o cierres la conexión, se ejecutará su evento StateChange, es decir, el código fuente existente en el procedimiento ConnectionOnStateChange. Fíjate que en el ejemplo he indicado que el mensaje se muestre en otro control Label diferente (Label2) al utilizado para mostrar los mensajes del servicio de SQL Server, porque al éstar el temporizador ejecutándose cada segundo, pocos mensajes vas a poder ver del estado de la conexión si utilizas para ambos mensajes el mismo control Label. ;-)

    ¡Eso es todo! Adapta el ejemplo a tus necesidades.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    sábado, 2 de abril de 2016 8:58
    Moderador